execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。
submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。
在Java5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。
两者都可以被ExecutorService执行
Future future = pool.submit(new RunnableTest("Task2")); try { if(future.get()==null){//如果Future's get返回null,任务完成 System.out.println("任务完成"); } } catch (InterruptedException e) { } catch (ExecutionException e) { //否则我们可以看看任务失败的原因是什么 System.out.println(e.getCause().getMessage()); }
Runnable任务没有返回值(见上面代码),Callable中的call()方法类似Runnable的run()方法,就是前者有返回值,后者没有。
同样,将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回null。
当将一个Callable的对象传递给ExecutorService的submit方法,则该call方法自动在一个线程上执行,并且会返回执行结果Future对象。
import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; public class CallableAndFuture { public static void main(String[] args) { //1s内得不到结果就抛异常 ExecutorService threadPool=Executors.newSingleThreadExecutor(); Future<String> future=threadPool.submit(new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(2000);//休息2s return "hello"; } }); try { System.out.println(future.get(1000, TimeUnit.MILLISECONDS)); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } //提交一组任务,take方法返回已完成的任务的一个任务对应的Future对象 ExecutorService threadPool2=Executors.newFixedThreadPool(10); CompletionService<Integer> completionService=new ExecutorCompletionService<>(threadPool2); for (int i=1;i<=10;i++){ final int seq=i; completionService.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { Thread.sleep(new Random().nextInt(3000)); return seq; } }); } for (int i=1;i<=10;i++){ try { System.out.println(completionService.take().get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } } }
参考文章:
submit与execute区别
http://blog.csdn.net/ryantotti/article/details/6956175
Callable与Runable接口
http://blog.csdn.net/yuzhiboyi/article/details/7775266
本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1685978