文章目录
join期间遇到中断的demo
- join期间遇到中断的demo
- join期间线程状态的两种查看方式
- 通过getState()查看线程状态
- 通过断点的方式查看状态
如下的代码演示了join期间被中断的情况. 用Thread.currentThread()
获取main线程. 并在子线程的run方法中, 把main线程中断. 需要注意的是, 如果main线程被中断了, 那么也要把子线程中断掉, 以保证数据的一致性, 即在如下的代码中thread.interrupt();
package com.thread.threadobjectclasscommonmethods;
import java.util.concurrent.TimeUnit;
/**
* 类名称:JoinInterrupt
* 类描述:演示join期间被中断的效果
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/30 13:40
* Version 1.0
*/
public class JoinInterrupt {
public static void main(String[] args) {
//拿到主线程
Thread mainThread = Thread.currentThread();
Thread thread = new Thread(() -> {
try {
//子线程对主线程进行中断
mainThread.interrupt();
TimeUnit.SECONDS.sleep(5);
System.out.println("run方法中 子线程执行完毕了 ");
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("run方法中 子线程中断");
}
});
thread.start();
System.out.println("等待子线程运行完毕");
try {
//是子线程加入到我们(main线程在等待子线程的过程中被中断了).
thread.join();
} catch (InterruptedException e) {
//主线程被中断, 主线程抛出异常
System.out.println(Thread.currentThread().getName() + " 主线程中断了");
//如果main线程被中断了, 那么也把子线程中断, 以保证线程的一致性
thread.interrupt();
e.printStackTrace();
}
System.out.println("main方法中 子线程运行完毕了 ");
}
}
程序打印如下. main线程中, 执行了thread.join();
,开始等待子线程. 在等待子线程的过程中, 被中断了. 因此打印出了main 主线程中断了
, 接着把子线程也中断了, 因此抛出了两个被中断的异常. 第一个为main线程的中断异常, 第二个为子线程在sleep过程中的中断异常.
如下的代码, 演示了join期间, 线程状态的查看方式, 主要是调用了main线程的mainThread.getState()
来查看线程的状态. 用于main线程在join期间, 等待子线程的状态查看 .
package com.thread.threadobjectclasscommonmethods;
/**
* 类名称:JoinThreadState
* 类描述:先join再mainThread.getState()
* 通过debugger看线程join前后状态的对比
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/30 14:08
* Version 1.0
*/
public class JoinThreadState {
public static void main(String[] args) throws InterruptedException {
Thread mainThread = Thread.currentThread();
Thread thread = new Thread(() -> {
try {
Thread.sleep(3000);
//休眠完成后, 就获取main线程的状态
System.out.println(mainThread.getState());
System.out.println(Thread.currentThread().getName() + "运行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "thread1");
thread.start();
System.out.println("开始等待子线程运行完毕");
thread.join();
System.out.println("子线程运行完毕");
}
}
控制台打印如下, 可以看到join期间, main线程的状态为 WAITING
将断点打在如下的两个地方 debug运行后, 可以看到main线程为running, 而子线程为sleeping休眠中
进入下一个断点后, 子线程为running, 而main线程为wait 等待状态.