我是靠谱客的博主 明亮皮带,最近开发中收集的这篇文章主要介绍java线程interrupt用法_用interrupt()中断Java线程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java代码  a4dfe34b76efa21a3d5b83c511978c38.png

I am running!

Calculating

I am running!

Calculating

I am running!

Calculating

****************************

Interrupted Thread!

****************************

ATask.run() interrupted!

在Java多线程中,线程的状态有 NEW, Runnable, Blocked, Waiting, Timed_Waiting, Terminated. 这是java虚拟机下的线程状态,与操作系统下的线程状态略有不同。线程状态以枚举类型定义在Thread.State中,并且当前线程可以通过getState()方法获取当前线程的状态。Runnable其实可以有两种状态,一种是获得了cpu,这在运行,这里把它表示为Running,另一种在队列中,等待调度。

这些状态之间的转化关系可以通过下面的转化图表示:

8562f3b08de52135f54aeaf48855d402.png

有些过程没有写,不然太乱了。

这里重点说一下stop()以及interrupt。

对于stop()方法,直接终止线程,释放线程所获的资源,但是在释放过程中会造成对象状态不一致,从而使程序进入未知的境地,已经很久不推荐使用了。可以通过设定标志位来检测线程终止状态,使线程自动终止。简略实现如下:

boolean stop = false;

public void run(){

while(!stop){

}

}

在需要终止线程的地方把stop设置为true即可。

interrupt方法好多初学者会感到困惑,发现一些情况下并不能终止线程。在JavaAPI中有对此详细的说明:

如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。

因此,可以看出,interrupt之后作用到wait() join() 已经sleep()上。 2014阿里巴巴笔试题的附加题中对这个知识进行了终点考核,其代码如下:

public class TestInterrupt {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Thread thread1 = new Thread(){

public void run(){

try{

long time = System.currentTimeMillis();

while(System.currentTimeMillis()-time<2000){

}

System.out.println("A1");

}

catch(Exception e)

{

System.out.println("B1");

}

}

};

thread1.start();

thread1.interrupt();

//在线程sleep状态下进行中断

Thread thread2 = new Thread(){

public void run(){

try {

this.sleep(2000);

System.out.println("A2");

} catch (Exception e) {

// TODO Auto-generated catch block

System.out.println("B2");

}

}

};

thread2.start();

thread2.interrupt();

//在线程wait状态下进行中断,其中wait()没有在同步块中

Thread thread3 = new Thread(){

public void run(){

try {

this.wait(2000);

System.out.println("A3");

} catch (Exception e) {

// TODO Auto-generated catch block

System.out.println("B3");

}

}

};

thread3.start();

thread3.interrupt();

//在线程wait状态下进行中断,其中wait()在同步块中

Thread thread4 = new Thread(){

public void run(){

try {

synchronized(this){

this.wait(2000);

System.out.println("A4");}

} catch (Exception e) {

// TODO Auto-generated catch block

System.out.println("B4");

}

}

};

thread4.start();

thread4.interrupt();

try{

thread4.start();

System.out.println("A5");

}

catch(Exception e)

{

System.out.println("B5");

System.out.println(e.toString());

}

}

}

我们可以运行,发下运行结果如下(不考虑执行顺序):

A1

B2

B3

B4

B5 //这个是由于一个thread,不能start两次引起的。。和interrupt无关

最后

以上就是明亮皮带为你收集整理的java线程interrupt用法_用interrupt()中断Java线程的全部内容,希望文章能够帮你解决java线程interrupt用法_用interrupt()中断Java线程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部