带返回值的Callable
JAVA线程相关的Runnable接口中的run()方法没有提供返回值,如下:
......
public void run() {
......
}
......
如果需要在线程A执行完成,得到返回值后,再继续执行某个业务。那么推荐使用JDK1.5中提供的带有“执行返回值”的线程定义接口:Callable。
如果还需要为多个线程的执行调度加入更复杂的控制逻辑,那么需要我们之前讨论过的同步机制和JDK1.5中java.util.concurrent.locks包中的工具配合使用,才能达到效果,下篇文章介绍。
JDK1.5的java.util.concurrent包中提供了一个Callable接口和一组相关机制,能够帮助程序员安全、快速、简洁的完成以上的功能(线程执行完成后,返回一个执行结果)。Callable接口中需要实现的接口方法为call(),这个方法有一个泛化的返回值 V,可以帮助返回定义的任何一种对象结果。接口源代码如下:
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
下面我们通过一段简单的代码,看一下Callable接口是如何完成执行结果的返回和激活等待线程的:
package com.carsmart.test;
import java.util.ArrayList;
import java.util.List;
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 CallableThreadTest {
public static void main(String[] args) {
MyCallableThread callableThread = new MyCallableThread(new Person("张老三&#