`

ArrayBlockingQueue take()和poll()的一点区别

 
阅读更多

使用take()函数,如果队列中没有数据,则线程wait释放CPU,而poll()则不会等待,直接返回null;同样,空间耗尽时offer()函数不会等待,直接返回false,而put()则会wait,因此如果你使用while(true)来获得队列元素,千万别用poll(),CPU会100%的。

 

另外,如果你希望ThreadPoolExecutor中常驻n个线程,请调用“public void allowCoreThreadTimeOut(boolean value)”将该属性设置为false,否则

 

 

Runnable getTask() {
        for (;;) {
            try {
                int state = runState;
                if (state > SHUTDOWN)
                    return null;
                Runnable r;
                if (state == SHUTDOWN)  // Help drain queue
                    r = workQueue.poll();
                else if (poolSize > corePoolSize || allowCoreThreadTimeOut)
                    r = workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS);
                else
                    r = workQueue.take();

会不停循环轮询队列,会占用大量CPU。

分享到:
评论

相关推荐

    ArrayBlockingQueue源码分析.docx

    通过以上分析,我们可以看到 `ArrayBlockingQueue` 的核心在于其基于锁和条件变量的并发控制机制,以及有界的特性,这使得它成为一种高效且可控的并发数据结构,适用于生产者-消费者模型或其他需要同步和缓冲的场合...

    ArrayBlockingQueue源码解析-动力节点共

    在ArrayBlockingQueue中,插入和移除元素的API包括put、offer、take和poll等。其中,put和take方法是阻塞的,如果队列满或空,它们会使得调用线程等待;而offer和poll则是非阻塞的,如果操作无法立即执行,它们会...

    26不让我进门,我就在门口一直等!—BlockingQueue和ArrayBlockingQueue.pdf

    2. `E poll(long timeout, TimeUnit unit)`:与`take()`相似,但在等待指定时间后如果没有元素,会返回`null`。 此外,还有其他辅助方法如`contains()`用于检查队列是否包含特定元素,`drainTo()`用于清空或部分...

    Java源码解析阻塞队列ArrayBlockingQueue常用方法

    为了实现线程安全,ArrayBlockingQueue使用了一个可重入锁`ReentrantLock`以及两个与之关联的条件变量`notEmpty`和`notFull`。`notEmpty`用于等待队列非空时的线程,而`notFull`则是等待队列未满时的线程。 在了解...

    Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理

    ArrayBlockingQueue内部还使用了两个Condition对象,notEmpty和notFull,它们分别对应队列不为空和不全满的状态。当线程尝试从空队列中取出元素或向满队列中添加元素时,会通过调用对应的await方法进入等待状态。当...

    Blocking Queue Usage

    如果希望在阻塞时设置超时时间,可以使用`offer`和`poll`方法的变体,如`offer(E e, long timeout, TimeUnit unit)`和`poll(long timeout, TimeUnit unit)`,这样当超时时,即使队列未满或未空,也会返回。...

    阻塞队列阻塞队列阻塞队列

    ArrayBlockingQueue支持公平和非公平两种策略,公平策略意味着等待最久的线程优先获得资源,而非公平策略则不保证这一点。在高并发场景下,非公平策略通常能提供更好的性能。 2. LinkedBlockingQueue ...

    PollDemo.rar

    Poll策略是Java并发库中ExecutorService的一个重要组成部分,它是从线程池中获取可运行任务的一种方式,与阻塞式的“take”方法不同,"poll"是非阻塞的,当没有任务时,它会立即返回null。 1. **线程池基础**: - ...

    简单实现BlockingQueue,BlockingQueue源码详解

    1. **ArrayBlockingQueue**:基于数组的有界阻塞队列,容量固定,插入和删除操作的性能较高,但是因为有界,所以需要预先知道队列的最大容量。 2. **LinkedBlockingQueue**:基于链表的阻塞队列,默认无界,也可以...

    BlockingQueue的使用

    2. 生产者线程和消费者线程如何使用`put()`和`take()`方法交互。 3. 如何处理队列满或空的异常情况,例如使用`offer()`和`poll()`方法的超时版本。 4. 如何控制并发线程数量,例如使用`ThreadPoolExecutor`结合...

    BlockQueue练习

    BlockQueue是Queue接口的子接口,提供了阻塞的插入(put)和获取(take)操作。除了基本的add、remove和element方法外,它还包含以下关键方法: - `offer(E e)`: 尝试将元素插入队列,如果队列已满则返回false。 ...

    Java并发编程--BlockingQueue.docx

    示例代码展示了如何创建生产者和消费者线程,它们共享同一个 BlockingQueue 实例,通过 `put()` 和 `take()` 方法实现数据的传递。 在 ArrayBlockingQueue 和 LinkedBlockingQueue 的实现中,当队列满时,生产者...

    并发容器——BlockingQueue相关类

    3. **公平性**:某些实现如`ArrayBlockingQueue`和`LinkedBlockingQueue`可以配置为公平模式,这意味着等待最久的线程将首先获得资源,而非总是新来的线程。 4. **异常处理**:在使用`BlockingQueue`时,应当捕获并...

    java中线程队列BlockingQueue的用法

    - `ArrayBlockingQueue`和`LinkedBlockingQueue`可以设置是否采用公平策略。公平策略意味着等待最久的线程优先获取资源,而非公平策略则不一定遵循此规则,可能会有更高的吞吐量但牺牲了公平性。 5. **生产者-消费...

    05.多线程数据保护(安全队列2

    2. **阻塞操作**:安全队列的插入(offer、put)和删除(poll、take)操作如果在队列满或空时会阻塞对应的操作线程,直到条件满足再继续执行,这种方式提高了系统的资源利用率。 3. **公平性**:某些安全队列提供了...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...

    Java并发程序设计教程

    阻塞队列支持多种操作,例如put和take分别用于线程安全地放置和取出元素,offer和poll用于非阻塞式操作,而drainTo则用于批量移动队列中的元素。 4. **线程间协调手段**:包括使用锁(lock)、条件(condition)...

Global site tag (gtag.js) - Google Analytics