interrupt 停止线程

Posted ljy-skill

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了interrupt 停止线程相关的知识,希望对你有一定的参考价值。

  该方法只是给线程设置了一个停止的标记 并不是真正的立即停止线程

  interrupted() 测试当前线程是否已经中断
  isInterrupted() 测试线程是否已经中断
  停止线程的方法:

1.异常法 (相当于return出去)
package entity.thread;

public class Mythread extends Thread

@Override
public void run() 
super.run();
try 
for(int i=0;i<500000;i++)
if(this.interrupted())
System.out.println("是停止状态了。。。");
throw new InterruptedException();

System.out.println("i=" + (i+1));

System.out.println("我在for下面");
 catch (InterruptedException e) 
System.out.println("进入异常方法了线程终止");
e.printStackTrace();




public static void main(String[] args) throws InterruptedException 
try 
Mythread mh = new Mythread();
mh.start();
mh.sleep(2000);
mh.interrupt();
 catch (Exception e) 
System.out.println("main catch");
e.printStackTrace();

System.out.println("end");




打印结果:
i=223322
i=223323
end
是停止状态了。。。
进入异常方法了线程终止
java.lang.InterruptedException
at entity.thread.Mythread.run(Mythread.java:12)

2.在沉睡中被停止 (程序会直接抛异常)
package entity.thread;

public class Mythread2 extends Thread

@Override
public void run() 
super.run();
try 
System.out.println("run begin");
Thread.sleep(200000);
System.out.println("run end");
 catch (InterruptedException e) 
System.out.println("在沉睡中被终止! 进入catch!"+ this.isInterrupted());
e.printStackTrace();


public static void main(String[] args) 
try 
Mythread2 mythread2 = new Mythread2();
mythread2.start();
mythread2.sleep(200);
mythread2.interrupt();
 catch (InterruptedException e) 
System.out.println("main catch");
e.printStackTrace();

System.out.println("end");


执行结果
run begin
end
在沉睡中被终止! 进入catch!false
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at entity.thread.Mythread2.run(Mythread2.java:10)

 

3.暴力停止 stop 方法 已经过时不建议使用并且会存在问题

以上是关于interrupt 停止线程的主要内容,如果未能解决你的问题,请参考以下文章

正确的使用interrupt停止线程

正确的使用interrupt停止线程

3.线程的八大核心基础知识之如何正确停止线程

java多线程技术: interrupt() 中断线程, 优雅停止线程及原理

Thread的中断机制(interrupt),循环线程停止的方法

线程的终止stop与线程的中断interrupted