标签:交换空间 socket private 消费者 public
第六章 任务执行
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
标签:交换空间 socket private 消费者 public
原文地址:http://muyunzhe.blog.51cto.com/9164050/1720550