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

来源:互联网 发布:foxbot编程序软件 编辑:程序博客网 时间:2024/06/05 15:54

今天这个就来研究一个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();}@Overridepublic void run() {super.run();try {sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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();}@Overridepublic void run() {super.run();try {sleeper.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName()+"join completed");}}


运行结果:

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

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

0 0
原创粉丝点击