Java 多執行緒 join和interrupt 方法
阿新 • • 發佈:2018-10-31
簡述:
輸出:
使用Java多執行緒中join和interrupt函式
《Java程式設計思想》 P669 ~ P670
一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。
如果某個執行緒在另一個執行緒t上呼叫t.join(), 此執行緒將被掛起, 直到目標執行緒t結束才恢復(即t.isAlive() 返回為假)
對join()方法的呼叫可以被中斷, 做法是在呼叫執行緒上呼叫interrupt()方法,這時需要用到 try-catch
Sleeper.java
package com.anialy.test.multithread.JoinAndInterrupt; public class Sleeper extends Thread { private int duration; public Sleeper(String name, int sleepTime){ setName(name); this.duration = sleepTime; start(); // 在建構函式中啟動 } @Override public void run() { try{ sleep(duration); } catch(InterruptedException e){ System.out.println(String.format("%s was interrupted. isInterrupted(): %b" , getName(), isInterrupted())); return; } System.out.println(getName() + " has awakened"); } }
Joiner.java
package com.anialy.test.multithread.JoinAndInterrupt; public class Joiner extends Thread { private Sleeper sleeper; public Joiner(String name, Sleeper sleeper) { setName(name); this.sleeper = sleeper; start(); } @Override public void run() { try { // 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此執行緒將被掛起, // 直到目標執行緒t結束才恢復(即t.isAlive() 返回為假) sleeper.join(); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println(getName() + " join completed"); } }
package com.anialy.test.multithread.JoinAndInterrupt;
public class Test1 {
public static void main(String[] args) {
Sleeper sleeper1 = new Sleeper("執行緒A-1500", 1500);
Joiner joiner1 = new Joiner("執行緒join-A", sleeper1);
}
}
輸出:
可以看到在第一條執行緒休眠1500毫秒之後,join-A的執行緒才完成
Test.java
package com.anialy.test.multithread.JoinAndInterrupt;
public class Test2 {
public static void main(String[] args) {
Sleeper sleeper = new Sleeper("執行緒A-1500", 1500);
Joiner joiner = new Joiner("執行緒Join-A", sleeper);
sleeper.interrupt();
}
}
輸出:
由於對sleeper執行緒使用了interrupt,sleeper沒有完成之前,就已經中斷了join()