2014-02-27 81 views
0

我正在製作一些虛擬程序來了解這個java類。 我的定時任務調用了一個任務,在中斷它3秒之前不做任何事情。 下面的代碼:FutureTask似乎沒有中斷

FutureTask<Integer> task = new FutureTask<>(new 
      Callable<Integer>(){ 
       @Override 
       public Integer call() throws Exception { 
        int i =0; 
        while(i<100000){ 
         ; 
        } 

        return 0; 
       } 

    }); 

    executor.execute(task); 
    try { 
     task.get(3000, TimeUnit.MILLISECONDS); 
     System.out.println("Everything was ok"); 
    } catch (InterruptedException | ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TimeoutException ex){ 
     boolean result = task.cancel(true); //here i cancel the thread 
     System.out.println("the task has timed out "+result); 
    } 

什麼情況是,catch塊被執行,但我的程序繼續工作,直到線程結束。這就像task.cancel沒有被接受。這是爲什麼?

回答

4

您的任務是計算綁定的。它不執行任何IO或睡眠,並且這是JVM檢查中斷標誌(任何引發InterruptedException的方法)的時間。因此你的任務是不可中斷的。

值得一讀Interrupt教程。注意:

如果一個線程很長時間沒有調用 拋出InterruptedException?然後它必須定期調用 Thread.interrupted,如果接收到中斷,則返回true。例如:

for (int i = 0; i < inputs.length; i++) { 
    heavyCrunch(inputs[i]); 
    if (Thread.interrupted()) { 
     // We've been interrupted: no more crunching. 
     return; 
    } 
} 

並且還

中斷機構被使用稱爲 中斷狀態的內部標誌實現。調用Thread.interrupt設置此標誌。當 線程通過調用靜態方法 線程中斷來檢查中斷時,中斷狀態被清除。非靜態的 isInterrupted方法,它被一個線程用來查詢另一箇中斷狀態 ,不改變中斷狀態 標誌。

注意,往往人們會寫類似:

try { 
    // interruptible operation 
} 
catch (InterruptedException e) { 
    // do nothing 
} 

不復位中斷標誌。這導致不可中斷的代碼。有關更多信息,請參見this JavaSpecialists newsletter

+0

嗯......問題在於,對於我的真實程序,我需要封裝來自jni庫的連接。我已經用這個連接做了同樣的程序,它也不會中斷。有沒有辦法強制線程停止? – Phate

+0

有關更多信息,請參閱上面的修改後的答案 –