快速业务通道

Java理论与实践: 线程池与工作队列 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
池为空时,会发生什么呢?试图向池线程传 递任务的调用者都会发现池为空,在调用者等待一个可用的池线程时,它的线程 将阻塞。我们之所以要使用后台线程的原因之一常常是为了防止正在提交的线程 被阻塞。完全堵住调用者,如在线程池的“明显的”实现的情况,可以杜绝我们 试图解决的问题的发生。

我们通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和 notify() 来通知等待线程新的工作已经到达了。该工作队列通常被实现成具 有相关监视器对象的某种链表。清单 1 显示了简单的合用工作队列的示例。尽 管 Thread API 没有对使用 Runnable 接口强加特殊要求,但使用 Runnable 对 象队列的这种模式是调度程序和工作队列的公共约定。

Java理论与实践: 线程池与工作队列(2)

时间:2010-12-20 IBM Brian Goetz

清单 1. 具有线程池的工作队列

public class WorkQueue {    private final int nThreads;    private final PoolWorker[] threads;    private final LinkedList queue;    public WorkQueue(int nThreads)    {      this.nThreads = nThreads;      queue = new LinkedList();      threads = new PoolWorker[nThreads];      for (int i=0; i<nThreads; i++) {        threads[i] = new PoolWorker();        threads[i].start();      }    }    public void execute(Runnable r) {      synchronized(queue) {        queue.addLast(r);        queue.notify();      }    }    private class PoolWorker extends Thread {      public void run() {        Runnable r;        while (true) {          synchronized(queue) {            while (queue.isEmpty()) {              try              {                queue.wait();              }              catch (InterruptedException ignored)              {              }            }            r = (Runnable) queue.removeFirst();          }          // If we don''t catch RuntimeException,          // the pool could leak threads          try {            r.run();          }          catch (RuntimeException e) {            // You might want to log something here          }        }      }    } }

您可能已经注意到了清单 1 中的实现使用的是 notify() 而不是 notifyAll() 。大多数专家建议使用 notifyAll() 而不是 notify() ,而且理 由很充分:使用 notify() 具有难以捉摸的风险,只有在某些特定条件下使用该 方法才是合适的。另一方面,如果使用得当, notify() 具有比 notifyAll() 更可取的性能特征;特别是, notify() 引起的环境切换要少得多,这一点在服 务器应用程序中是很重要的。

清单 1 中的示例工作队列满足了安全使用 notify() 的需求。因此,请继续 ,在您的程序中使用它,但在其它情形下使用 notify() 时请格外小心。

使用线程池的风险

虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的 。用线程池构建的应用程序容易遭受任何其它多线程应用程序容易遭受的所有并 发风险,诸如同步错误和死锁,它还容易遭受特定于线程池的少数其它风险,诸 如与池有关的死锁、资源不足和线程泄漏。

Java理论与实践: 线程池与工作队列(3)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号