2017-04-04 61 views
3

在我看來,如果實際上有可能阻止任務的執行,那麼Future.cancel(false)應該只返回true。Future.cancel(false)在執行任務中返回true

但是從下面的代碼我們可以看出它是矛盾的。

由於任務canceld它不應該打印"Not expecting this statement!!!"

public class Test { 
    public static void main(String[] args) throws InterruptedException { 
     ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
     final boolean[] canceled = { false }; 
     ScheduledFuture<?> future = executor.schedule(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(1000); 
        if (canceled[0]) 
         System.out.println("Not expecting this statement!!!"); 
       } catch (InterruptedException e) { 
       } 
      } 
     }, 0, TimeUnit.SECONDS); 
     Thread.sleep(100); 
     canceled[0] = future.cancel(false); 

     executor.shutdown(); 
     executor.awaitTermination(2, TimeUnit.SECONDS); 
    } 
} 

不幸的是這個程序的輸出爲「不奢望這個說法!」

有人可以解釋這種行爲。

回答

5

因爲你叫canceled[0] = future.cancel(false);與參數false後添加日誌。從Future.cancel的javadoc:

如果任務已經啓動,則mayInterruptIfRunning參數確定是否執行此任務的線程應該以試圖停止任務被中斷。

@param mayInterruptIfRunning {@code true}如果執行這個任務的線程應該被中斷;否則,正在進行的任務被允許完成

當你調用cancel,你的任務已經開始,你允許它完成,所以取消操作實際上是成功的,並返回true,如果你打電話canceled[0] = future.cancel(true);,你」我看不到輸出。

0

在您的代碼中,boolean[] canceled在兩個線程之間共享,並且沒有對此變量的同步訪問。所以,結果將是意想不到的。同樣來自https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(boolean)的文檔,如果任務無法取消,通常會因爲它已正常完成而返回false。 嘗試取消任務,看看哪一個最先被執行(儘管它可能並不總是幫助)

+0

在我的情況下,它返回true.Hence問題提出 –

+0

嘗試增加主要方法中的睡眠時間。您可能會看到不同的答案 – prasanth

+0

誰給這個問題+1這麼快,它在前15秒內得到+1。 –