Java 线程与并发研究系列三(join()方法使用)

今天这个就来研究一个Java线程中join()方法以及interrupt()方法的使用。

线程A在线程B中调用join()方法的效果就是,线程B一直被挂起,直到等线程A执行完毕以后才继续执行,当然有join()方法中传入参数的,那就是

线程B被挂起多久,然后才开始执行。其中在调用join()方法的过程中,线程B是可以被中断的,做法就是在调用join()方法的线程上调用interrupt()

方法,但是会抛出一个异常。

interrupt()方法的作用其实不是中断线程,而是中断正在挂起的线程,使其唤醒。api中对interrupt()的描述是这样的,如果线程是调用下面方法被

阻塞的:wait(),join(),sleep()。调用interrupt()方法后将会抛出InterruptedException异常,并且线程的interrupt status将会被清除,也就是

在抛出InterruptedException异常后,调用interrupted()方法后将会返回false。

由上面的解释我们能够知道如果一个线程没有处于挂起的状态,调用interrupt()方法是无用的。

下面我看一看join()方法使用的小例子:

public class MyThread{
	
	public static void main(String[] args) {
		Sleeper sleeper =new Sleeper("Sleeper");
		Joiner joiner = new Joiner("joiner", sleeper);
		sleeper.interrupt();
	}
}

class Sleeper extends Thread{
	
	public Sleeper(String name){
		super(name);
		start();
	}
	
	@Override
	public void run() {
		super.run();
		try {
			sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(getName()+" isInterrupted():"+isInterrupted());
		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();
	}
	
	@Override
	public void run() {
		super.run();
		try {
			sleeper.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(getName()+"join completed");
	}
}


运行结果:

Java 线程与并发研究系列三(join()方法使用)_第1张图片

我们可以看见,在调用join()方法后,线程被挂起,调用interrupt()方法后,抛出InterruptedException异常,他的interrupt state状态被清除

变成 false,然后Sleeper线程被唤醒,执行完毕,然后Joiner线程再执行。

你可能感兴趣的:(android)