zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/attilax/p/15199385.html
Copyright © 2011-2022 走看看