簡體   English   中英

ThreadPool 拋出 java.util.concurrent.FutureTask 無法轉換為 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 中情況並非如此,我也不認為這是可能的。

拋出異常,因為優先阻塞隊列不知道如何比較它的元素。 它不允許不可比較的對象。 你有兩個選擇:

  1. 使隊列元素實現可比
  2. 在構造函數中為隊列提供比較器

簽出 PriorityBlocking 隊列 javadoc: https ://docs.oracle.com/javase/7/docs/api/java/util/concurrent/PriorityBlockingQueue.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM