(一)
Callable和Runnable比较相似,都可以用来实现线程任务。但callable使用了泛型设计,使用一个V类型值,能够
在执行结束后返回一个V类型的值。而Runable只会返回一个void,不能够获得执行的结果。
(二)
使用Callable要和Future类或者Futuretask类搭配使用,他们类似一种对线程执行任务的返回数据的操作的封装类。
使用方法
1 Callable 和 future
首先写一个Callable接口的实例,实现Call()方法,然后通过Thread或者线程池submit函数使用这个Callable实例,
futuretask不同于future,它进一步丰富了future的功能。futuretask实现了Runnalefuture接口,这是他具有了可以
被线程执行的能力。所以使用时直接可以把实例化好的Callable实例以参数的形式传给它,然后就可以直接使用Thread
或者线程池submit函数操作它。在最后直接调用它的get函数就能获得相应的返回结果,当然他还有很多其他的功能。
Callable和Runnable比较相似,都可以用来实现线程任务。但callable使用了泛型设计,使用一个V类型值,能够
在执行结束后返回一个V类型的值。而Runable只会返回一个void,不能够获得执行的结果。
(二)
使用Callable要和Future类或者Futuretask类搭配使用,他们类似一种对线程执行任务的返回数据的操作的封装类。
使用方法
1 Callable 和 future
首先写一个Callable接口的实例,实现Call()方法,然后通过Thread或者线程池submit函数使用这个Callable实例,
将返回结果赋值给future类型的一个实例,然后就可以通过这个实例对返回的结果进行get查询等操作
public class Test {public static void main(String[] args) {ExecutorService executor = Executors.newCachedThreadPool();Task task = new Task();Future<Integer> result = executor.submit(task);executor.shutdown();try {Thread.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println("主线程在执行任务");try {System.out.println("task运行结果"+result.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println("所有任务执行完毕");}
}
class Task implements Callable<Integer>{@Overridepublic Integer call() throws Exception {System.out.println("子线程在进行计算");Thread.sleep(3000);int sum = 0;for(int i=0;i<100;i++)sum += i;return sum;}
}
futuretask不同于future,它进一步丰富了future的功能。futuretask实现了Runnalefuture接口,这是他具有了可以
被线程执行的能力。所以使用时直接可以把实例化好的Callable实例以参数的形式传给它,然后就可以直接使用Thread
或者线程池submit函数操作它。在最后直接调用它的get函数就能获得相应的返回结果,当然他还有很多其他的功能。
public class Test {public static void main(String[] args) {//第一种方式ExecutorService executor = Executors.newCachedThreadPool();Task task = new Task();FutureTask<Integer> futureTask = new FutureTask<Integer>(task);executor.submit(futureTask);executor.shutdown();//第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread/*Task task = new Task();FutureTask<Integer> futureTask = new FutureTask<Integer>(task);Thread thread = new Thread(futureTask);thread.start();*/try {Thread.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println("主线程在执行任务");try {System.out.println("task运行结果"+futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println("所有任务执行完毕");}
}
class Task implements Callable<Integer>{@Overridepublic Integer call() throws Exception {System.out.println("子线程在进行计算");Thread.sleep(3000);int sum = 0;for(int i=0;i<100;i++)sum += i;return sum;}
}