1. 程式人生 > >Java 多執行緒 join和interrupt 方法

Java 多執行緒 join和interrupt 方法

簡述:

使用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");
	}
}



Test1.java
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()