一。java
1>Callable和Future接口介绍异步
Callable是相似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是能够被建立为线程的来执行的类。ide
2>Callable和Runnable比较测试
1. Callable规定的方法是call,Runnable规定的方法是runthis
2. callable的任务执行后能够返回值,Runnable的run是无返回值的
spa
3.call方法能够抛出异常,run方法不能抛出异常。咱们能够根据call方法是否抛出异常进行不一样操做(由于try-catch不该该做为控制流程的条件,因此不推荐这样作);线程
4.运行callable任务可拿到一个Future对象,Future表示的是异步计算结果,它提供了检查计算是否完成的方法和等待计算完成检索计算结果的方法。经过Future对象能够了解任务的执行状况,能够取消任务的执行,还能够获取任务执行的结果。
code
3>Future中的方法介绍对象
1.future.get()将等待callable线程执行返回结果。future.get(timeout, unit)若是等待超时将抛出超时异常。接口
2.future.cancel(boolean)将试图终端当前线程,boolean做用带研究
例子测试,代码以下,注意被注掉的两个地方,能够去掉注释运行试试
public class CallableTest { public static class MyCallableClass implements Callable<String>{ private int flag=0; public MyCallableClass(int flag){ this.flag=flag; } @Override public String call() throws Exception { if(flag==3){ while(true){ System.out.println("在执行线程3"); Thread.sleep(5000); } } Thread.sleep(5000); return "线程"+flag+"执行完"; } } public static void main(String[] args) { MyCallableClass callableClass=new MyCallableClass(0); MyCallableClass callableClass2=new MyCallableClass(1); MyCallableClass callableClass3=new MyCallableClass(2); ExecutorService service=Executors.newFixedThreadPool(3); try { Future<String> future2=service.submit(callableClass2); Future<String> future=service.submit(callableClass3); // System.out.println(future.cancel(false)); System.out.println(future2.get()); System.out.println(future.get()); Future<String> future3=service.submit(callableClass); System.out.println("task3"+future3.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } // catch (Exception e) { // e.printStackTrace(); // } service.shutdownNow(); } }