星空网 > 软件开发 > Java

java并发:中断一个正在运行的线程

要使任务和线程能安全可靠地停止,并不是一件很容易的事情,java没有提供任何机制来安全地终止线程,那么我们该怎么办呢?

下面我们先来了解一下java中的中断机制:

java并发:中断一个正在运行的线程

 

java中断机制是一种协作机制,也就是说在某个线程中对另一个线程调用interrupt()方法并不能直接终止该线程,需要被中断的线程自己处理中断请求

 

interrupted() 和 isInterrupted()的主要区别:

非静态方法isInterrupted()用来查询某线程的中断状态,且不会改变该线程的中断状态标识;

静态方法interrupted()检查中断状态时,中断状态会被清零(置为false)。

 

在下面的例子中,主线程通过调用t.interrupt()方法将线程t的中断状态设置为true,线程t可以在合适的时候调用interrupted()方法或isInterrupted()方法来检测其中断状态并做相应处理:

package com.test;public class ThreadTest extends Thread {  public void run() {    while (true) {      if (Thread.interrupted()) {        System.out.println("Someone interrupted me.");        break;      } else {        System.out.println("Going...");      }      long now = System.currentTimeMillis();      while (System.currentTimeMillis() - now < 1000) {        //让循环持续一段时间,打印的输出语句会少一些      }    }  }  public static void main(String[] args) throws InterruptedException {    ThreadTest t = new ThreadTest();    t.start();    Thread.sleep(3000);    t.interrupt();  }}

结果如下:

Going...Going...Going...Someone interrupted me.

 

(1)对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true;

(2)对于可取消的阻塞状态中的线程, 比如等待在Thread.sleep(), Object.wait(), Thread.join(),这些函数上的线程,  这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false.

 

下面这段程序会使得阻塞在Thread.join()方法上的主线程在收到中断信号后结束:

package com.test;public class ThreadTest extends Thread {     private Thread parent;     public ThreadTest(Thread parent){     this.parent = parent;   }      public void run() {     while (true) {       System.out.println("sub thread is running...");       long now = System.currentTimeMillis();       while (System.currentTimeMillis() - now < 2000) {         //让循环持续一段时间,打印的输出语句会少一些       }       parent.interrupt();     }   }      public static void main(String[] args){     ThreadTest t = new ThreadTest(Thread.currentThread());     t.start();     try {       t.join();     } catch (InterruptedException e) {       System.out.println("Parent thread will die...");     }   } } 

结果如下:

sub thread is running...Parent thread will die...sub thread is running...sub thread is running...sub thread is running...sub thread is running...

从结果可以看出,线程t发出中断请求后主线程结束(此时线程t仍在运行)

 




原标题:java并发:中断一个正在运行的线程

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

衣服fba:https://www.goluckyvip.com/tag/47454.html
衣品诚制衣厂:https://www.goluckyvip.com/tag/47455.html
医护服装:https://www.goluckyvip.com/tag/47456.html
医疗跨境电商:https://www.goluckyvip.com/tag/47457.html
医美专题报告:https://www.goluckyvip.com/tag/47459.html
VC账号激活:https://www.goluckyvip.com/tag/4746.html
皇帝的皇宫=:https://www.vstour.cn/a/363188.html
海南岛琼海市旅游景点 琼海市的旅游景点:https://www.vstour.cn/a/363189.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流