【并发编程】-- 线程的join方法实现原理、线程状态切换

101 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

接着上一篇文章 【并发编程】-- 线程的sleep方法、join方法实现原理

等待线程执行完成,最多等待millis毫秒数加nacos纳秒数,如果超时还为完成,那么立即返回,millis等待毫秒数,nacos附加等待的纳秒数(0,999999)。当传入的millis为负数、nacos不在区间(0,999999)内会抛出IllegalArgumentException异常;当其他线程中断了当前线程时,会抛出InterruptedException异常,当抛出该异常时,当前线程的中断标志位会被清除。

public final synchronized void join(long millis,int nacos) throws InterruptedException{
	if(millis < 0){
	throw new IllegalArgumentException("timeout value is negative");
	}
	if(nacos < 0 || nacos > 999999){
	throw new IllegalArgumentException("nacos second timeout value out of range");
	}
	if(nacos >= 500000 || (nacos != 0 && millis == 0)){
	millis++:
	}
	join(millis);
}

join方法用于等待线程执行完成,当其他线程中断了当前线程时,会抛出InterruptedException异常,若抛出该异常,则当前线程的中断标志位会被清除。

public final void join() throws InterruptedException{
	join(0);
}

Thread方法使用与线程状态转换

查看Thread中常用的方法与线程状态之间的关系,通过这些关系可以更好的确认java线程的状态。

public class MyThread extends Thread{
	@Override
	public void run(){
	try{
		sleep(1000);
	}catch(InterruptedException e){
		e.printStackTrace();
	}	
	}
}

运行类代码如下:

public class ThreadStateRun {
    public static void main(String[] args) throws InterruptedException {
        //创建状态 NEW
        Thread thread=new MyThread();
        System.out.println("创建状态:  "+thread.getState());
        //就绪状态 RUNNABLE
        thread.start();
        System.out.println("就绪状态:  "+thread.getState());
        //线程休眠100毫秒 TIMED_WAITING
        Thread.sleep(100);
        System.out.println("休眠状态:  "+thread.getState());
        //中断状态,如果当前线程执行阻塞方法,则会抛出异常java.lang.InterruptedException
        thread.interrupt();
        System.out.println("中断状态:  "+thread.getState());
        //等待线程thread完成,当完成后,其状态为TERMINATED
        thread.join();
        System.out.println("结束状态:  "+thread.getState());
    }
}

运行结果如下:

创建状态: NEW

就绪状态: RUNNABLE

休眠状态: TIMED_WAITING

中断状态: TIMED_WAITING

结束状态: TERMINATED

java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.ozx.concurrentprogram.executor.domain.MyThread.run(MyThread.java:12)