簡體   English   中英

Future.cancel(true)下面發生了什么

[英]What is happening underneath the Future.cancel(true)

假設我有一個Runnable實例:

class MyTask implements Runnable {

  public void run() {
     //some heavy calculation which takes time
      Thread.sleep(5000)
     //rest code
     ...
  }

}

然后,我使用ExecutorService提交上述任務:

ExecutorService service = Executors.newFixedThreadPool(3);
Future<?> task = service.submit(new MyTask());

現在,我可以通過task.cancel(true);取消任務task.cancel(true); 據我了解, task.cancel(true)將中斷正在運行該任務的工作線程,例如Thread.currentThread().interrupt() 但這僅設置一個標志來告知工作線程已中斷。

我的問題是:如果MyTask Runnable已開始運行, future.cancel(true)如何實際上停止我在run()代碼並繼續執行其余代碼? 是否在下面定期檢查工作線程的中斷標志? 我的意思是我不明白如何僅通過將中斷標志設置為true來取消run()中的代碼。

Future.cancel不保證您的工作程序代碼將停止執​​行。 它的作用是設置中斷標志,並導致任何阻塞的JDK調用都拋出InterruptedException。 您的工作程序代碼可以選擇重新拋出被中斷的異常並定期檢查被中斷的標志,在這種情況下,取消機制將起作用。 否則,您可以選擇吞下InterruptedException而不理會iterrupted標志,在這種情況下,cancel機制不會執行任何操作,只能將canceled標志設置為true。

參見http://www.ibm.com/developerworks/library/j-jtp05236/

有一個稱為isInterrupted()的方法,該方法通過返回true / false來告知線程中正在運行的代碼。

這通常由您可能在線程中調用的諸如wait,sleep之類的方法檢查。 但是,如果您不使用這些方法,則必須手動檢查此方法[isInterrupted()],以確定是否有人中斷了您的線程。

如果有任何機會,您可以決定執行什么操作(例如,讓我們說:拋出InterruptedException或從循環中斷等)。

暫無
暫無

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

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