2013-08-07 41 views
1

我正在閱讀Java線程。我正在調查sleep()方法。這些書指出,睡眠線程如何發送中斷給自己?

當線程遇到一個sleep調用,它必須進入休眠 指定的時間內,除非是其喚醒 時間之前被中斷。

我在閱讀有關中斷的問題,但線程如何將中斷髮送給自己?我想這樣 另一個線程可以發送中斷嗎?我理解正確嗎?另外,做兩個 的線程,一個會發送中斷的應該是有相同的目標Runnable?如果 假設一個線程被中斷,是否回到Runnable狀態?我真的很抱歉, 如果我聽起來很愚蠢,這對我來說是非常新的。謝謝

+0

當您想要學習多線程時,最好使用ExecutorServices,它們更容易使用,更強大。我個人認爲,使用普通線程有點過時,並且使多線程比需要的更加複雜。 – ssindelar

+0

@Casey即使在Executor框架內,瞭解中斷過程也很重要。 – assylias

+0

@Casey,我很新的線程,所以首先只是刷新基礎知識。 – benz

回答

5

線程在睡眠時不能自行中斷,因爲它在睡覺。

一張圖片勝過千言萬語所以這裏是一個線程開始睡覺,主線程中斷,一個簡單的例子:

public static void main(String[] args) throws Exception { 
    Runnable sleeper = new Runnable() { 
     public void run() { 
      try { 
       System.out.println("sleeper is going to sleep"); 
       Thread.sleep(1000); 
       System.out.println("sleeper is awake"); 
      } catch (InterruptedException e) { 
       System.out.println("sleeper got interrupted"); 
      } 
     } 
    }; 

    Thread t = new Thread(sleeper); 
    t.start(); //run sleeper in its own thread 
    Thread.sleep(500); //sleeping in main a little to make sure t is started 
    t.interrupt(); 
} 

它打印:

sleeper is going to sleep 
sleeper got interrupted 
+0

我有點困惑你的榜樣。在這裏,你正在睡覺睡覺()在可運行。然後你再次在main方法中使當前線程進入sleep()。在這種情況下,即使main也可以睡覺,因爲它也可以是當前線程。然後你在枕木實例本身上調用interrupt()。這不是有點矛盾,線程不能中斷自己。我確信,我以錯誤的方式感受到了一個例子,你能詳細說明嗎? – benz

+3

睡眠者睡眠10秒,但因爲它在另一個線程中運行,並且這個不需要立即創建,所以在中斷睡眠之前,主要等待500ms(足以創建另一個線程的時間) –

+0

啊我得到了現在看到圖片。正確。非常感謝你。 – benz

0

是的,只有另一個線程可以發送中斷到睡眠線程。線程不可能向自己發送中斷(簡單地將其與現實生活對比,如果某人正在睡覺然後喚醒他,我們需要其他人)。是的,中斷一個線程後可以回到Runnable狀態。

+0

第二句困擾我,它允許線程自行中斷。從Oracle文檔中斷開中斷線程「除非當前線程正在自行中斷,這總是被允許的......」 – Antoniossss

+0

線程不可能自行中斷。 – user2550754

0

據我所知,它導致中斷的另一個線程。所以當一個線程在一段時間內調用睡眠時,Java運行時會記錄下來,當時間流逝時,它會導致喚醒睡眠線程的中斷。

+0

謝謝,這兩個線程是否需要在相同的Runnable上運行? – benz

+0

編寫代碼時,第二個線程不應該關注你。因爲這是運行代碼本身的JRE線程。 – 2013-08-08 10:22:30

0

Thread#interrupt

線程可以中斷自己。它總是可能的。

實施例是:

public static void main(String[] args) throws ParseException, InterruptedException { 
    Thread.currentThread().interrupt(); 
    try{ 
     Thread.currentThread().sleep(200); 
    }catch(InterruptedException ie){ 
     System.out.println("Current thread is interrupted"); 
    } 
} 

調用中斷不會拋出exception.It設置中斷狀態標誌
當該線程被阻塞在等待的調用()等待(長),或等待(長,INT)Object類的方法或的加入()加入(長)加入(長,INT)睡眠(長),或睡眠(長,INT),這個類的方法,那麼它的中斷狀態將被清除,它會得到一個InterruptedException。 或

+0

你在睡覺時能打斷自己嗎? :D – MrROY

+0

線程可以自行中斷,但不能在睡眠時中斷。在你的例子中,線程從不睡覺,因爲當調用睡眠時,它意識到它已被中斷並立即拋出異常。睡眠也是一種靜態方法,所以你可以使用Thread.sleep。 – assylias

+0

@assylias我同意你的意見 – Prabhaker