第六章 任务执行

6.1 在线程中执行任务

串行-》多线程-》有限个多线程

6.2 executor框架

通过有界队列可以防止高负荷程序过度消耗内存

java.lang.concurrent提供了线程池作为实现executor框架的一部分

executor接口:提供生产者-消费者模式

基于executor的web服务器:

public class TaskExecutionWebServer {
    private static final int NTHREADS = 100;
    private static final Executor exec
            = Executors.newFixedThreadPool(NTHREADS);

    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(80);
        while (true) {
            final Socket connection = socket.accept();
            Runnable task = new Runnable() {
                public void run() {
                    handleRequest(connection);
                }
            };
            exec.execute(task);
        }
    }

    private static void handleRequest(Socket connection) {
        // request-handling logic here
    }
}

通过继承executor接口,就可以实现不同的服务器处理方式

线程池:与task queue密切相关,在工作队列中保存了所有待执行的任务,工作线程提前建立,然后从工作队列中取出任务执行,执行完毕重新等待下一个任务,工作线程可以重用。

通过调用executors中的静态方法来创建线程池:newFixedThreadPool newCachedThreadPool newSingleThreadPool newScheduledThreadPool 

executor的生命周期:通过executor的子接口executorServer来实现生命周期管理

延迟任务与周期任务:Timer  或者用scheduledThreadPoolExecutor来替代

6.3 找出可利用的并行性

携带结果的任务callable 和future

callable:它认为主入口点(call)将返回一个值或者抛出一个异常

future:表示一个任务的生命周期,并提供了相应的方法来判定是否已经完成或者被取消

executorServer中的所有submit方法将一个runnable或者callable提交给executor,从而返回一个future来获得任务的执行结果或者取消任务。还可以显式的为runnable或者callable实例化一个futureTask

completionServer:将executor和blockQueue结合起来,

为任务设置时限

invokeall