callable和runable以及线程池对他们的执行

一 Callable接口和Runnable接口相似,都是执行新线程的方法。
区别:
1. Callable需要实现call方法,而Runnable需要实现run方法;
2. Callable与executors联合在一起,在任务完成时可立刻获得一个更新了的Future,runable无返回值

Future接口,一般都是取回Callable执行的状态用的。其中的主要方法:
cancel,取消Callable的执行,当Callable还没有完成时

get,获得Callable的返回值  (根据新建callable时候的泛型,这里直接获取。比如:
public class CallAbleTestThread implements Callable<String>{
 @Override
 public String call() throws Exception {
  System.out.println(Thread.currentThread().getName());
  return Thread.currentThread().getName()+",返回了";
 }
}

 // 构造一个线程池 
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, 
                TimeUnit.SECONDS, new ArrayBlockingQueue(3), 
                new ThreadPoolExecutor.DiscardOldestPolicy()); 
       
        System.out.println(threadPool.submit(new CallAbleTestThread()).get());
  这里打印:pool-2-thread-1,返回了

isCanceled,判断是否取消了
isDone,判断是否完成

3.线程池调用时,Runnable是用execute方法执行无返回值,Callable用submit执行返回一个Future
  Future<String> fu =  threadPool.submit(new CallAbleTestThread());
        threadPool.execute(new RunAbleTestThread());

二。线程池的关系
 ThreadPoolExecutor extends AbstractExecutorService implements(interface) ExecutorService extends (interface) Executor
 
 有时候使用Executors构造线程池,例如:
 ExecutorService executor = Executors.newFixedThreadPool(10);
 实际上构造的也是一个ThreadPoolExecutor,源码如下:
 

callable和runable以及线程池对他们的执行_第1张图片
 
总:execute方法是由 Executor接口定义,submit方法是由ExecutorService接口定义。
所以ThreadPoolExecutor  必然可使用 submit获取线程的返回值

 
 
 
 
 
 
 
 

 

你可能感兴趣的:(callable和runable以及线程池对他们的执行)