您可以考慮爲什麼此代碼無法正常工作並始終輸出「已完成」的任何原因,但第二個示例沒有任何問題。我正在使用最新的JDK(8u45)。ExecutorService workStealingPool和取消方法
public static class MyClass implements Runnable { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException ex) { System.out.println("Interrupted"); return; } System.out.println("Finished"); } public static void main(String[] args) { // spot the difference -> ExecutorService executorService = Executors.newWorkStealingPool(4); Future future = executorService.submit(new MyClass()); Thread.sleep(100); future.cancel(true); } }
而下面的例子完美的作品:
public static class MyClass implements Runnable { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException ex) { System.out.println("Interrupted"); return; } System.out.println("Finished"); } public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); Future future = executorService.submit(new MyClass()); Thread.sleep(100); future.cancel(true); } }
編輯:添加返回和更新的睡眠時間和另一個例子。
哇,這是令人不安的。在我的系統上(Java 1.8.0_45-b14,Linux 3.2.0-4-amd64),它不打印*任何東西。*就像你一樣,我發現只有newWorkStealingPool返回的ExecutorService有這個問題。我們中的一個人應該將其作爲錯誤提交。 – VGR