仅供学习,我编写了以下代码用于自定义线程池引用和编辑此处显示的代码。如代码所示,我将 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”检查和实际删除之间,队列可能会被另一个线程修改,这可能会导致您提到的错误。这就是所谓的“竞争条件”。
因此,为了解决这个问题,您需要一种方法来阻止其他线程对队列的访问,或者通过“锁定”,使用带有共享锁定对象的“同步”块。或者简单地通过“轮询”而不是删除。
添加回答
举报
0/150
提交
取消