多线程08-Callable和Future

1.简介

     Callable是一个接口,与Runnable类似,包含一个必须实现的call方法,可以启动为让另一个线程来执行,执行Callable可以得到一个Future对象 该对象可以监听Callable的执行结果 也可以取消该任务的执行

 

2.案例 

   

package org.lkl.thead.foo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAndFuture {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
      ExecutorService threadPool =   Executors.newSingleThreadExecutor() ;
      Future<String> future =  threadPool.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            System.out.println("call method");
            Thread.sleep(100) ;
            return "liaokailin";
        }
    }) ; 
     System.out.println(" future.isCancelled():"+ future.isCancelled()); ;
     while(!future.isDone()){
         System.out.println("---等待结果---");
     }
   //   future.cancel(true) ;
      System.out.println(future.get() );;
    }
}

 

         通过threadPool.submit可以返回一个Future对象 ,通过该对象的 future.isDone 表示Callable中的任务是否执行完成  true表示完成

         future.cancle(true) 可以取消Callable中的任务(call)

         future.get() 得到的是Callable中call方法的返回值.

         注意 代码执行到future.get()的时候会等待Callable中的call方法执行 等待执行结束以后get()方法才会执行完成 ,否则一直在等待call的执行   也可以通过 future.get(timeout, unit) 

方法来设置等待几秒以后获取call的返回值 如果没有获取到结果则返回异常.

       

3. CompletionService

     通过CompletionService可以处理一组Callable任务 ,通过其take方法可以获得Future对象

       

    ExecutorService threadPool =  Executors.newFixedThreadPool(10) ;
        CompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool) ;
        
        for(int i =1 ;i<=10;i++){
            final int flag = i ;
            service.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(new Random().nextInt(1000)) ;
                    return flag;
                }
            }) ;
        }
        
        for(int i =1 ;i<=10;i++){
            Future<Integer> future = service.take() ;
            System.out.println(future.get() );
            
        }

 

结果:

8
1
5
3
2
10
6
4
9
7

 

  执行的结果是无序的 那么说明CompletionService获得Callable的结果是 看哪个Callable先执行完成则先获得其返回的结果

 

如果将上面的 ExecutorService threadPool =  Executors.newFixedThreadPool(10) ; 方法换成:

ExecutorService threadPool =  Executors.newSingleThreadExecutor() ;

 

则执行的结果是从1-10有序的 

    那是因为当前线程池中只有一个线程  要等待for循环的第一次执行完才会去执行第二次的for循环.

 

 

 

 

多线程08-Callable和Future,布布扣,bubuko.com

多线程08-Callable和Future

上一篇:C++中使用函数指针 【瓦特芯笔记】


下一篇:《JAVA与模式》之适配器模式(转载)