• 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  
  • 相关阅读:
    第五周课堂测试补充
    20162327WJH2016-2017-2《程序设计与数据结构》课程总结
    20162327WJH实验五——数据结构综合应用
    20162327WJH实验四——图的实现与应用
    20162327 《程序设计与数据结构》第十一周学习总结
    20162327WJH第三次实验——查找与排序2
    20162327 《程序设计与数据结构》第九周学习总结
    20162327WJH第二次实验——树
    20162327 《程序设计与数据结构》第七周学习总结
    20162327WJH使用队列:模拟票务站台代码分析
  • 原文地址:https://www.cnblogs.com/attilax/p/5964141.html
Copyright © 2020-2023  润新知