Javaスレッドjoin()メソッドの研究ノート

スレッドは他のスレッドでjoin()メソッドを呼び出すことができます。その結果、2番目のスレッドが終了するまで一定時間待機してから続行します。スレッドが別のスレッドtでt.join()を呼び出すと、このスレッドは一時停止され、ターゲットスレッドtが終了するまで再開されません(つまり、t.isAlive()はfalseを返します)。

また、join()メソッドを呼び出すときにタイムアウトパラメーターを指定することもできます(単位はミリ秒、またはミリ秒とナノ秒の場合があります)。そのため、この時間が経過してもターゲットスレッドが終了していない場合、join()メソッドは常に戻ることができます。 。

join()メソッドの呼び出しは、呼び出し元のスレッドでinterrupted()メソッドを呼び出すことで中断できます。このとき、try-catch句が必要です。

class Sleeper extends Thread{
    
    
	private int duration;
	public Sleeper(String name,int sleepTime) {
    
    
		super(name);
		duration=sleepTime;
		start();
	}
	public void run() {
    
    
		try {
    
    
			sleep(duration);
		}catch(InterruptedException e) {
    
    
			System.out.println(getName()+" was interrupted. "+" is interrupted: "+isInterrupted());
			return;
		}
		System.out.println(getName()+" has awakened");
	}
}
class Joiner extends Thread{
    
    
	private Sleeper sleeper;
	public Joiner(String name,Sleeper sleeper) {
    
    
		super(name);
		this.sleeper=sleeper;
		start();
	}
	public void run() {
    
    
		try {
    
    
			sleeper.join();
		}catch(InterruptedException e) {
    
    
			System.out.println("Interrupted");
		}
		System.out.println(getName()+" join completed");
	}
}
public class Joining {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
        Sleeper sleepy=new Sleeper("Sleepy",1500),
        		grumpy=new Sleeper("grumpy",1500);
        Joiner dopey=new Joiner("Dopey",sleepy),
        		doc=new Joiner("Doc",grumpy);
        grumpy.interrupt();
	}

}
/*
grumpy was interrupted.  is interrupted: false
Doc join completed
Sleepy has awakened
Dopey join completed
*/

おすすめ

転載: blog.csdn.net/weixin_43916777/article/details/104228699