![](/img/trans.png)
[英]java.util.ArrayList cannot be cast to java.lang.Comparable
[英]ThreadPool throws java.util.concurrent.FutureTask cannot be cast to java.lang.Comparable
我有一個非常簡單的程序:
public static void main(String[] args) throws Exception {
class MyThread2 implements Runnable{
@Override
public void run() {
while (true) {
try {
if (Thread.interrupted()) {
System.out.println("Terminated!");
throw new InterruptedException();
}
} catch (InterruptedException e) {
return;
}
}
}
}
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2,
2,
1,
TimeUnit.SECONDS,
new PriorityBlockingQueue<>(),
Executors.defaultThreadFactory());
executor.submit(new MyThread2());
executor.submit(new MyThread2());
executor.submit(new MyThread2());
executor.shutdownNow();
}
在使用 maven 運行它時,它會打印:
[WARNING]
java.lang.ClassCastException: java.util.concurrent.FutureTask cannot be cast to java.lang.Comparable
at java.util.concurrent.PriorityBlockingQueue.siftUpComparable (PriorityBlockingQueue.java:357)
at java.util.concurrent.PriorityBlockingQueue.offer (PriorityBlockingQueue.java:489)
at java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:1371)
at java.util.concurrent.AbstractExecutorService.submit (AbstractExecutorService.java:112)
at MyThreadFactory.main (MyThreadFactory.java:33)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:254)
at java.lang.Thread.run (Thread.java:748)
並掛起。 我的程序中沒有PriorityBlockingQueue
的任何“可比較”實現,這個異常是從哪里來的?
PriorityBlockingQueue
需要可比較的元素,而您的MyThread2
類無法提供這些元素。 所以你的程序中確實有Comparable
,但它是內部的東西。
例如,如果您無法提供可比較的元素,請更改您的executor
程序以使用LinkedBlockingQueue
。 或者顯然,找到一種方法來“解釋”如何比較您提交的任務(通過實現Comparable
)。
現在我想起來了,如果 API 能夠檢測到它,那將是非常酷的。 因此,如果您在編譯時提供PriorityBlockingQueue
並調用submit(new MyThread2())
,這將檢測到並引發編譯時錯誤(說MyThread2
不是Comparable
)。 不幸的是,在這個 API 中情況並非如此,我也不認為這是可能的。
拋出異常,因為優先阻塞隊列不知道如何比較它的元素。 它不允許不可比較的對象。 你有兩個選擇:
簽出 PriorityBlocking 隊列 javadoc: https ://docs.oracle.com/javase/7/docs/api/java/util/concurrent/PriorityBlockingQueue.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.