为了账号安全,请及时绑定邮箱和手机立即绑定

ArrayBlockingQueue NoSuchElementException

ArrayBlockingQueue NoSuchElementException

HUH函数 2021-10-06 10:50:29
仅供学习,我编写了以下代码用于自定义线程池引用和编辑此处显示的代码。如代码所示,我将 ArrayBlockingQueue 用于任务队列。代码:import java.util.ArrayList;import java.util.List;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;public class ThreadPoolService {    private final BlockingQueue<Runnable> taskQueue;    private final int corePoolSize;    private ThreadPoolService(int corePoolSize) {        this.corePoolSize = corePoolSize;        this.taskQueue = new ArrayBlockingQueue<>(corePoolSize);        ThreadPool[] threadPool = new ThreadPool[corePoolSize];        for (int i = 0; i < corePoolSize; i++) {            threadPool[i] = new ThreadPool();            threadPool[i].start();        }    }    public static ThreadPoolService newFixedThreadPool(int size) {        return new ThreadPoolService(size);    }    public void execute(Runnable task) {        try {            taskQueue.offer(task, 10, TimeUnit.SECONDS);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    private class ThreadPool extends Thread {        Runnable task;        @Override        public void run() {            while (true) {                try {                    while (!taskQueue.isEmpty()) {                        task = taskQueue.remove();                        task.run();                    }                } catch (RuntimeException ex) {                    ex.printStackTrace();                }            }        }    }    public static void main(String[] args) {        ThreadPoolService pool = ThreadPoolService.newFixedThreadPool(10);        Runnable task1 = () -> {            System.out.println(" Wait for sometime: -> " + Thread.currentThread().getName());            try {                TimeUnit.SECONDS.sleep(2);            } catch (InterruptedException e) {                e.printStackTrace();            }此代码有时运行良好,有时会出错。
查看完整描述

3 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

在“while”检查和实际删除之间,队列可能会被另一个线程修改,这可能会导致您提到的错误。这就是所谓的“竞争条件”。

因此,为了解决这个问题,您需要一种方法来阻止其他线程对队列的访问,或者通过“锁定”,使用带有共享锁定对象的“同步”块。或者简单地通过“轮询”而不是删除。


查看完整回答
反对 回复 2021-10-06
  • 3 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号