Think In Java 读书笔记:Concurrency

736 查看

package com.snda.sync.impl.test;

import java.util.ArrayList;
import java.util.concurrent.*;

/**
 * Executor类是一种有效的广泛使用的以工作队列为基础的的线程池的正确实现,无须尝试编写自己的线程池,这样容易出错。
 * Callable是并发编程库Concurrent新添加的类,它提供的call()方法可以返回各线程的返回值
 * Callable 与 future :http://blog.csdn.net/ghsau/article/details/7451464
 * Callable 接口类似于Runnable但是Callable无法返回结果也无法返回异常。Callable返回的结果可以被Future拿到。
 * 通过submit来执行Callable线程并取得线程的返回值
 *
 * 在Java中如果需要设定代码执行的最长时间,即超时,可以用Java的ExecutorService 类配合Future接口来实现,Future接口
 * 是Java线程的Future模式的实现,可以来进行异步运算。
 * Created by xuyifei on 14-4-22.
 */
class TaskWithResult implements Callable<String> {

    private int id;

    public TaskWithResult(int id) {
        this.id = id;
    }

    @Override
    public String call() throws Exception {
        return "result of TaskWithResult " + id;

    }
}

public class CallableDemo {
    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Future<String>> results = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            results.add(exec.submit(new TaskWithResult(i)));
        }
        for (Future<String> fs : results) {
            try {
                System.out.println(fs.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } finally {
                exec.shutdown();
            }
        }


    }
}