`
lzj0470
  • 浏览: 1277038 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

具有线程池的工作队列

    博客分类:
  • java
阅读更多

清单 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实现的线程池、消息队列功能

    线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、大数据量和分布式系统中具有广泛应用。 线程池是一种线程使用模式,它预先创建了一组可重用的线程,当有任务需要执行时,不再直接...

    线程池 和队列-Brian Goetz

    任务队列是线程池中线程用来获取任务的队列。正确使用队列可以帮助线程池更有效地管理任务的执行顺序和依赖关系。队列的类型和容量选择也是实现高性能线程池的关键因素之一。 在Java等编程语言中,已经提供了内置的...

    BlockingQueue队列自定义超时时间取消线程池任务

    首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞,直到有消费者取走元素;当队列空时,消费者线程会被阻塞,直到生产者放入新的元素。常用实现如`...

    Pool_Thread.rar_C 线程池_thread pool_多线程 队列_控制台多线程_线程池 队列

    在多线程编程中,线程池通常会维护一个工作队列,用于存储待处理的任务。当线程完成一个任务后,它不会立即终止,而是检查队列中是否有其他任务可执行。如果有,线程会取下一个任务并继续执行;如果没有,线程可能...

    线程池(可伸缩任务队列)demo.rar

    这个"线程池(可伸缩任务队列)demo"提供了一个很好的学习和实践平台,对于理解线程池的工作原理,以及如何在C++中实现和使用线程池具有很大的帮助。开发者可以通过阅读和分析代码,进一步掌握线程池的设计思想和...

    线程-线程池-锁-集合-Map-队列.docx

    队列是另一种重要的数据结构,Java中的`Queue`接口提供了FIFO(先进先出)的数据结构,常用于线程间的通信或作为线程池的工作队列。`ArrayBlockingQueue`、`LinkedBlockingQueue`等是常见的阻塞队列实现,它们在多...

    线程池简单实现chenjiegui

    5. **拒绝策略(Rejected Execution Handler)**:当线程池和工作队列都满时,新提交的任务将根据预设的策略进行处理,常见的拒绝策略有抛出异常(`AbortPolicy`)、忽略任务(`CallerRunsPolicy`,由调用者线程执行...

    队列:队列在线程池等有限资源池中的应用.pdf

    当线程池中的所有工作线程都在忙碌时,新提交的任务会被暂时存放在队列中,直到有空闲线程可用时才会被执行。此外,通过调整队列的类型(例如`LinkedBlockingQueue`、`ArrayBlockingQueue`等),可以实现不同场景下...

    JAVA线程池原理以及几种线程池类型介绍

    #### 六、线程池的工作队列 在实现线程池时,通常会使用一个工作队列来存储等待执行的任务。这个队列可以是无界的或有界的,取决于具体的实现需求。例如,`ArrayBlockingQueue`就是一个典型的有界队列实现。 #### ...

    linux线程池c源码

    `thrmgr_dispatch`函数则负责将任务加入到线程池的工作队列中,并通知线程进行处理。 #### 五、小结 通过上述分析可以看出,这个线程池实现较为简单明了,易于理解和使用。它利用了POSIX线程库提供的原语,如互斥...

    Java中的线程与线程池.pptx

    - handler:拒绝策略,当线程池和工作队列都满时,用于处理新提交的任务。 使用Executors构建线程池时需要注意,如使用默认设置可能导致线程池积压过多任务或创建过多线程,从而引发内存溢出。因此,推荐自定义配置...

    一个线程池封装类及例子程序

    3. **线程管理策略**:当工作队列满时,线程池如何处理新任务(例如拒绝服务、等待或扩展线程池)。 4. **线程生命周期管理**:线程何时终止、如何重用和何时创建新线程。 在"A programming model to use a thread ...

    TOMCAT的线程池源码

    TaskQueue通常使用阻塞队列(如LinkedBlockingQueue)实现,它具有很好的性能特性,如线程安全和无锁操作。当队列满时,提交任务的线程会被阻塞,直到队列中有空闲位置。反之,当队列为空时,等待工作的线程会被阻塞...

    09队列:队列在线程池等有限资源池中的应用.pdf

    队列还常用于实现各种具有特定特性的数据结构。比如循环队列就是一种特殊类型的队列,它使用固定大小的数组和两个指针来实现,允许在数组到达边界时,将指针重置到数组的开始位置,从而模拟一个环形的队列。循环队列...

    C++11实现基于无锁队列的线程池项目源码(课程作业).zip

    C++11实现基于无锁队列的线程池项目源码(课程作业).zipC++11实现基于无锁队列的线程池项目源码(课程作业).zipC++11实现基于无锁队列的线程池项目源码(课程作业).zipC++11实现基于无锁队列的线程池项目源码(课程作业)...

    threadpool 线程池 C语言版

    线程池在多线程编程中扮演着重要角色,它是一种高效的线程管理机制,能够有效地管理和调度系统中的线程资源。...在开发过程中,理解和掌握线程池的工作原理及其C语言实现,对于编写高性能的多线程程序具有重要意义。

    c#线程池使用demo

    2. **任务调度**:线程池根据任务队列中的任务数量和系统状态动态调整工作线程的数量,确保系统资源得到合理分配。 3. **优先级调度**:虽然线程池本身并不支持优先级调度,但在.NET Framework 4.5及以上版本中,你...

    线程池的实现以及底层原理.docx

    1. FixedThreadPool:该类型的线程池具有固定数量的线程,适用于执行固定数量的任务。 2. SingleThreadExecutor:该类型的线程池只有一个线程,适用于执行顺序执行的任务。 3. CachedThreadPool:该类型的线程池可以...

    c++写的线程池 附带测试数据,很不错

    线程池是一种多线程处理形式,它将...总之,理解和掌握线程池的概念以及如何在C++中实现和使用线程池,对于提升软件性能和优化服务器处理能力具有重要意义。通过实践和学习,开发者可以更好地应对高并发场景下的挑战。

Global site tag (gtag.js) - Google Analytics