可以采用标志位方法.但是如果是被sleep和wait的时候作用不大. 推荐使用中断异常机制.代码如下:
- public class InterruptedThreadDemo {
- public static void main(String[] args) {
- // 子线程开启
- ThreadTerminal tt = new ThreadTerminal();
- tt.start();
- try {
- // 主线程休息3s,然后打断子线程
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // 打断子线程
- tt.interrupt();
- }
- }
- class ThreadTerminal extends Thread {
- private int counter = 0;
- public void run() {
- synchronized (this) {
- while (true) {
- System.out.println("time = " + System.currentTimeMillis());
- counter++;
- try {
- if (counter == 5) {
- // 使线程处于阻塞状态
- wait();
- }
- } catch (InterruptedException e) {
- // 捕获InterruptedException,然后退出程序
- System.out.println("捕获到InterruptedException , 线程结束");
- return;
- }
- }
- }
- }
- }
复制代码
另外,我们还要注意:
1,每个线程都有一个boolean类型的中断状态.当中断线程时,这个线程的中断状态将被设置为true.
2,interrupt方法能够中断目标线程,而isInterrupted方法能返回目标线程的中断状态.静态的interrupted方法将清除当前线程的中断状态,并返回它之前的值,这也是清除中断状态的唯一方法.
3,响应中断执行的操作: 清除中断状态, 抛出InterruptedException,表示阻塞操作由于中断提前结束.JVM并不能保证阻塞方法检测到中断的速度,但在实际情况中响应速度还是非常快的.
4,调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息.
5,一般而言,中断是实现取消的最合理方式
如有疑问可以继续探讨 |