您的位置:首页 > 编程语言 > Java开发

[Java] 线程中断(一)

2012-10-23 17:39 183 查看
正常情况下,一个线程完成它所有的任务后,就会自动退出。线程所持有的资源以及线程本身都会被释放掉。但是,在有些情况下,比如某些条件发生了改变或我们已经获得了想要的结果,这时虽然线程还没有执行完毕,但是我们已经不需要它在继续执行了,这时候就可以中断正在执行的线程。

想象一下,要使一个正在运行的线程中断、不再继续运行,我们该怎么做呢?一种方法是我们可以直接把这个线程杀掉,就像在任务管理器里面结束进程那样。采用这种方式可以快速的中断线程,但是存在一定得安全隐患。因为线程正在运行着什么,我们并不清楚,它可能正在读写一个文件,或正在与网络资源通信,或动态分配了内存,或对共享资源加了锁,如果我们不分青红皂白,暴力的干掉它,危险也是显而易见。如内存无法释放,文件无法关闭,造成死锁等等。所以通过外力来中断一个正在运行的线程,显然不是一个很好的做法。

既然外力不能很好的中断一个正在运行线程,那要谁去中断它呢?知己知彼,百战百胜。当然要最了解它的人去中断它。可能有人要问,谁最了解正在运行的线程呢,答案非线程本身莫属。所以要中断一个正在运行的线程,最好的做法是让它自我了断。我们要做的事就是告诉它,嗨,你该结束了。

实际上JVM也是这样做的,每一个线程都有一个状态,表明它是否已经中断,那么我们如何获得和修改这个状态呢?可以调用Thread的interrupt()。其实这个方法做的事情也不多,主要就是修改状态为中断,告诉线程它该中断了。还可以调用Thread的isInterrupted()方法来测试线程是否处于中断状态。其实interrupt()方法调用后,仅仅是状态发了改变,线程还是会正常的继续运行,那么我们只能判断线程的中断状态,自己写代码来处理具体的中断细节。

下面的示例也说明了调用interrupt()后,仅仅是状态发了变了,线程并没有中断。

Thread t3 = new Thread(new Runnable(){
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("线程执行," + i + "次!");
System.out.println("执行中断前,是否中断:" + Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt();
System.out.println("执行中断后,是否中断:" + Thread.currentThread().isInterrupted());
}
}});

t3.start();


下面是执行结果:

线程执行,0次!

执行中断前,是否中断:false

执行中断后,是否中断:true

线程执行,1次!

执行中断前,是否中断:true

执行中断后,是否中断:true

线程执行,2次!

执行中断前,是否中断:true

执行中断后,是否中断:true

线程执行,3次!

执行中断前,是否中断:true

执行中断后,是否中断:true

线程执行,4次!

执行中断前,是否中断:true

执行中断后,是否中断:true

可以看到在第一次执行中断前,中断状态时false,执行中断后,状态变为true。此后再执行中断,对结果没有影响。

如觉得文章有不对之处,敬请指出,共同讨论!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: