paip.java 多线程参数以及返回值Future FutureTask 的使用.

paip.java 多线程参数以及返回值Future FutureTask 的使用.


在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。
所以run的返回值是void类型。


作者Attilax  艾龙,  EMAIL:1466519819@qq.com 
来源:attilax的专栏
地址:http://blog.csdn.net/attilax


如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。
但后者需要前者的结果,就需要用callable接口了。
callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。


线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。
这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。






FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。 
Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。


以下是单个FUture...多个能行配合线程池以及list,参考.java Future用法和意义一句话击破_archlinux吧_百度贴吧


// ExecutorService executor = Executors.newSingleThreadExecutor();   
//如果不需要特定的结果,则考虑使用下列形式的构造:Future<?> f = new FutureTask<Object>(runnable, null)  
FutureTask futureTask =   
      new FutureTask(new Callable() {//使用Callable接口作为构造参数   
        public Object call() {

          //真正的任务在这里执行,这里的返回值类型为String,可以为任意类型   
         
        //ini wordLib   need2s
    fentsiOr fentsiCca22=new fentsiOr(); 
    fentsiCca22.iniFentsiWordlibFromdb();//haosi 2s
    return fentsiCca22;
      }});   
// 使用futureTask创建一个线程  
        Thread Thread1 = new Thread(futureTask);  
        Thread1.start();  
        // 测试后台的计算线程是否完成,如果未完成则等待  
      //  if (!futureTask.isDone()) {  
        
        
        
        
        
        
        System.out.println("--other work");
        //need 300 ms about
System.out.println("--start ini renva envent db");
renvaEventC rec=new renvaEventC();
rec.iniTypeKeywordLibFromDB();
System.out.println("  rec.iniTypeKeywordLibFromDB(); ok" );
rec.iniEventKeywordlibFromdb();
//ini wordlib  in writeToIndex();
//ini word_stopword  not need
//cb3  ini map_Renva4problem
this.inimap4Renva();  //prob renva fenlei map   180ms
     //   renvaEventC rec = null;
System.out.println("--start ini renva envent db finish");





        fentsiOr fentsiOrcb9;        
try {
fentsiOrcb9 = (fentsiOr) futureTask.get();
// future.get(5000, TimeUnit.MILLISECONDS); //取得结果,同时设置超时执行时间为5秒。
} catch (Exception e1) {
e1.printStackTrace();
throw new RuntimeException(e1);
}  
System.out.println(fentsiOrcb9);






参考:
Future和FutureTask - 每天进步一点点! - ITeye技术网站.htm
java Future 接口介绍 - yangyan19870319的专栏 - 博客频道 - CSDN.NET.htm
java Future用法和意义一句话击破_archlinux吧_百度贴吧.htm  
posted @ 2013-12-11 12:35  attilaxAti  阅读(288)  评论(0编辑  收藏  举报