gpt4 book ai didi

java - 带有 PriorityBlockingQueue 的 NullPointerException

转载 作者:行者123 更新时间:2023-11-29 08:58:01 34 4
gpt4 key购买 nike

我在自定义线程拉取中使用 PriorityBlockingQueue 时遇到问题,其中 poll 方法导致 NullPointerException。使用此设置时

int POOL_SIZE = 5;
int OVERHEAD_POOL_SIZE = 10;
long LIFE_TIME = 5000;
TimeUnit LIFE_TIME_UNIT = TimeUnit.MILLISECONDS;

new ThreadPoolExecutor(POOL_SIZE, OVERHEAD_POOL_SIZE,
LIFE_TIME, LIFE_TIME_UNIT, new PriorityBlockingQueue<Runnable>());

有时遇到以下堆栈跟踪,而不是 Executors.newCachedThreadPool():

Exception in thread "pool-14-thread-3" java.lang.NullPointerException
at java.util.PriorityQueue.siftDownComparable(PriorityQueue.java:624)
at java.util.PriorityQueue.siftDown(PriorityQueue.java:614)
at java.util.PriorityQueue.poll(PriorityQueue.java:523)
at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:225)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:957)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:917)
at java.lang.Thread.run(Thread.java:662)

基本上,我想按优先级对队列中的 Runnable 进行排序:

class MyRunnableFuture implements 
RunnableFuture<Boolean>, Comparable<MyRunnableFuture>

有线的事情是:异常并不总是抛出,但如果我在 PriorityQueue.siftDownComparable 中设置断点,则发生异常的机会更高。

有什么想法吗?我找到了其他人having the same problem ,但没有人真正知道解决方案。在 ThreadPool 中使用时,是否必须手动同步队列?我正在使用队列,因为我不想同步它。我理解这些描述好像队列已经在内部同步了?感谢您的回答!

最佳答案

在阅读下面的评论后更新:所有的麻烦都是因为使用submit 而不是execute 而在前者中,所有的线程都被包装了在 RunnableFuture 内部当然不实现 Comparable 接口(interface)。这就是比较失败的原因。 NullPointerException 让我分心,这是在新的工作线程试图提取之前无法插入的作业时引起的。 (线索:PriorityBlockingQueue 没有插入新作业,因为抛出了 ClassCastException。同时,ThreadPoolExecutor 认为有一个新工作可用并提醒下一个工作人员。工作人员提取一个不存在的工作并抛出 NullPointerExceptionClassCastException 被吞没并记录在我的应用程序深处,我没有跟踪这个足够仔细,因为我试图找到 NullPointerException 的原因。

为了完整起见,ThreadPoolExecutor 的提交方法实际上做了以下事情:

public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}

感谢你们的帮助(在评论中!)。

PS:卑鄙的错误。

关于java - 带有 PriorityBlockingQueue 的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140613/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com