使用Callable和FutureTask创建线程

  使用Callable和FutureTask,可以实现有返回值的线程创建,并且可以抛出异常:

package concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class CallableDemo implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        // 计算1-100的和
        int sum = 0;

        for (int i = 1; i <= 100; i++)
            sum += i;

        return sum;
    }

}

public class TestCallable {

    public static void main(String[] args) {

        CallableDemo cd = new CallableDemo();

        // 使用Callable方式创建线程,需要FutureTask类的支持,用于接收运算结果,可以使用泛型指定返回值的类型
        FutureTask<Integer> result = new FutureTask<>(cd);

        new Thread(result).start();

        int sum = 0;

        // 接收运算结果
        // 只有当该线程执行完毕后才会获取到运算结果,等同于闭锁的效果
        try {
            sum = result.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        System.out.println("sum is " + sum);

    }
}