我正在閱讀Java線程。我正在調查sleep()
方法。這些書指出,睡眠線程如何發送中斷給自己?
當線程遇到一個
sleep
調用,它必須進入休眠 指定的時間內,除非是其喚醒 時間之前被中斷。
我在閱讀有關中斷的問題,但線程如何將中斷髮送給自己?我想這樣 另一個線程可以發送中斷嗎?我理解正確嗎?另外,做兩個 的線程,一個會發送中斷的應該是有相同的目標Runnable?如果 假設一個線程被中斷,是否回到Runnable
狀態?我真的很抱歉, 如果我聽起來很愚蠢,這對我來說是非常新的。謝謝
我正在閱讀Java線程。我正在調查sleep()
方法。這些書指出,睡眠線程如何發送中斷給自己?
當線程遇到一個
sleep
調用,它必須進入休眠 指定的時間內,除非是其喚醒 時間之前被中斷。
我在閱讀有關中斷的問題,但線程如何將中斷髮送給自己?我想這樣 另一個線程可以發送中斷嗎?我理解正確嗎?另外,做兩個 的線程,一個會發送中斷的應該是有相同的目標Runnable?如果 假設一個線程被中斷,是否回到Runnable
狀態?我真的很抱歉, 如果我聽起來很愚蠢,這對我來說是非常新的。謝謝
線程在睡眠時不能自行中斷,因爲它在睡覺。
一張圖片勝過千言萬語所以這裏是一個線程開始睡覺,主線程中斷,一個簡單的例子:
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
至於主要問題 - 睡眠線程不能因爲它睡覺而自行中斷,但任何其他線程可以試圖破壞睡眠的線程。 Here you have doc explaining threads and thread lifecycle.
謝謝@Antoniosss,我有點困惑,會發送中斷的線程,是否應該具有相同的Runnable? – benz
是的,只有另一個線程可以發送中斷到睡眠線程。線程不可能向自己發送中斷(簡單地將其與現實生活對比,如果某人正在睡覺然後喚醒他,我們需要其他人)。是的,中斷一個線程後可以回到Runnable
狀態。
第二句困擾我,它允許線程自行中斷。從Oracle文檔中斷開中斷線程「除非當前線程正在自行中斷,這總是被允許的......」 – Antoniossss
線程不可能自行中斷。 – user2550754
據我所知,它導致中斷的另一個線程。所以當一個線程在一段時間內調用睡眠時,Java運行時會記錄下來,當時間流逝時,它會導致喚醒睡眠線程的中斷。
謝謝,這兩個線程是否需要在相同的Runnable上運行? – benz
編寫代碼時,第二個線程不應該關注你。因爲這是運行代碼本身的JRE線程。 – 2013-08-08 10:22:30
線程可以中斷自己。它總是可能的。
實施例是:
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。 或
當您想要學習多線程時,最好使用ExecutorServices,它們更容易使用,更強大。我個人認爲,使用普通線程有點過時,並且使多線程比需要的更加複雜。 – ssindelar
@Casey即使在Executor框架內,瞭解中斷過程也很重要。 – assylias
@Casey,我很新的線程,所以首先只是刷新基礎知識。 – benz