持续创作,加速成长!这是我参与「掘金日新计划 · 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)