ArrayBlockingQueue NoSuchElementException

仅供学习,我编写了以下代码用于自定义线程池引用和编辑此处显示的代码。


如代码所示,我将 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();

            }

此代码有时运行良好,有时会出错。


HUH函数
浏览 143回答 3
3回答

守着一只汪

在“while”检查和实际删除之间,队列可能会被另一个线程修改,这可能会导致您提到的错误。这就是所谓的“竞争条件”。因此,为了解决这个问题,您需要一种方法来阻止其他线程对队列的访问,或者通过“锁定”,使用带有共享锁定对象的“同步”块。或者简单地通过“轮询”而不是删除。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java