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
按优先级对队列中的 s 进行排序:
class MyRunnableFuture implements
RunnableFuture<Boolean>, Comparable<MyRunnableFuture>
连线的事情是:异常并不总是被抛出,但如果我在里面设置一个断点PriorityQueue.siftDownComparable
,发生异常的机会就更高了。
有任何想法吗?我发现其他人也有同样的问题,但没有人真正知道解决方案。在 a 中使用时是否必须手动同步队列ThreadPool
?我正在使用队列,因为我不想同步它。我理解描述好像队列已经在内部同步了?感谢您的任何回答!