第8章 线程池的使用
任务和执行策略是隐含耦合的,包括:依赖性任务、使用线程封闭机制执行的任务、对响应时间敏感的任务以及使用ThreadLocal的任务。
8.1 处理运行时间较长的任务
采用限定任务等待资源的时间,而不要无限期等待。Java类库大多数可阻塞的方法中,都提供的限定时间的版本和无限时间的版本,如 Thread.join, BlockingQueue.put, CountDownLatch.await, Selector.select。 如果等待超时,可以标记任务失败,然后中止任务或者将任务重新放回队列重新执行。
8.2配置ThreadPoolExecutor
newFixedThreadPoolExecutor 工厂方法将线程池的基本大小和最大大小设置为参数中制定的值,而创建的线程池不会超时。newCachedThreadPool工厂方法将线程池的最大大小设置为Integer.MAX_VALUE, 而将基本大小设置为0.
ThreadPoolExecutor允许提供一个BlockingQueue来保存等待执行的任务。基本的任务排队方法有3中:无界队列(LinkedBlockingQueue),有界队列(ArrayBlockingQueue,有界的LinkedBlockingQueue, PriorityBlockingQueue)和同步移交(Synchronous Handoff)。
8.3 饱和策略
当有界队列被填满以后,饱和策略开始发挥作用。ThreadPoolExecutor的饱和策略可以通过调用setRejectedExecutionHandler来修改。JDK提供了几种不同的饱和策略:AbortPolicy, CallerRunsPolicy, DiscardPolicy, DiscardOldestPolicy.
8.4 线程工厂
默认的线程工厂将创建一个新的、非守护的线程,并且不包含特殊的配置信息。我们可以自定义自己的线程工厂来打印日志信息。
第9章 图形用户界面应用程序
几乎所有的GUI工具包(包括Swing和SWT)都被实现为单线程子系统,这意味着所有的GUI操作都被限制在单个线程中。