src: http://www.informit.com/articles/article.aspx?p=26326&seqNum=3

Interrupting Threads

A thread terminates when its run method returns. (In the first version of the Java programming environment, there also was astop method that another thread could call to terminate a thread. However, that method is now deprecated. We will discuss the reason later in this chapter.)

There is no longer a way to force a thread to terminate. However, the interrupt method can be used to request termination of a thread. That means that the run method of a thread ought to check once in a while whether it should exit.

public void run()
{
. . .
while (no request to terminate && more work to do)
{
do more work
}
// exit run method and terminate thread
}

However, as you have learned, a thread should not work continuously, but it should go to sleep or wait once in a while, to give other threads a chance to do their work. But when a thread is sleeping, it can't actively check whether it should terminate. This is where the InterruptedException comes in. When the interrupt method is called on a thread object that is currently blocked, the blocking call (such as sleep or wait) is terminated by an InterruptedException.

There is no language requirement that a thread that is interrupted should terminate. Interrupting a thread simply grabs its attention. The interrupted thread can decide how to react to the interruption by placing appropriate actions into the catch clause that deals with the InterruptedException. Some threads are so important that they should simply ignore their interruption by catching the exception and continuing. But quite commonly, a thread will simply want to interpret an interruption as a request for termination. The run method of such a thread has the following form:

public void run()
{
try
{
. . . while (more work to do)
{
do more work
}
}
catch(InterruptedException exception)
{
// thread was interrupted during sleep or wait
}
finally
{
cleanup, if required
}
// exit run method and terminate thread
}

However, there is a problem with this code skeleton. If the interrupt method was called while the thread was not sleeping or waiting, then no InterruptedException was generated. The thread needs to call the interrupted method to find out if it was recently interrupted.

while (!interrupted() && more work to do)
{
do more work
}

In particular, if a thread was blocked while waiting for input/output, the input/output operations are notterminated by the call to interrupt. When the blocking operation has returned, you need to call theinterrupted method to find out if the current thread has been interrupted.

NOTE

Curiously, there are two very similar methods, interrupted and isInterrupted. The interruptedmethod is a static method that checks whether the current thread has been interrupted. (Recall that a thread is interrupted because another thread has called its interrupt method.) Furthermore, calling the interrupted method resets the "interrupted" status of the thread. On the other hand, the isInterrupted method is an instance method that you can use to check whether any thread has been interrupted. Calling it does not change the "interrupted" status of its argument.

It is a bit tedious that there are two distinct ways of dealing with thread interruption—testing the "interrupted" flag and catching the InterruptedException.

It would have been nice if methods such as sleep had been defined to simply return with the "interrupted" flag set when an interruption occurs—then one wouldn't have to deal with theInterruptedException at all. Of course, you can manually set the "interrupted" flag when anInterruptedException is caught:

try
{
sleep(delay);
}
catch (InterruptedException exception)
{
Thread.currentThread().interrupt();
}

You need to use this approach if the sleep method is called from a method that can't throw any exceptions.

NOTE

You'll find lots of published code where the InterruptedException is squelched, like this:

try { sleep(delay); }
catch (InterruptedException exception) {} // DON'T!

Don't do that! Either set the "interrupted" flag of the current thread, or propagate the exception to the calling method (and ultimately to the run method).

If you don't want to clutter up lots of nested methods with isInterrupted tests, you can turn the "interrupted" flag into an exception.

if (isInterrupted()) throw new InterruptedException();

Assuming that your code is already prepared to terminate the run method when anInterruptedException is thrown, this is a painless way of immediately terminating the thread when an interruption is detected. The principal disadvantage is that you have to tag your methods with

throws InterruptedException

since, alas, the InterruptedException is a checked exception.

java.lang.Thread

  • void interrupt() 
    sends an interrupt request to a thread. The "interrupted" status of the thread is set to true. If the thread is currently blocked by a call to sleep or wait, an InterruptedException is thrown.

  • static boolean interrupted() 
    tests whether or not the current thread (that is, the thread that is executing this instruction) has been interrupted. Note that this is a static method. The call has a side effect—it resets the "interrupted" status of the current thread to false.

  • boolean isInterrupted() 
    tests whether or not a thread has been interrupted. Unlike the static interrupted method, this call does not change the "interrupted" status of the thread.

  • static Thread currentThread() 
    returns the Thread object representing the currently executing thread.

Adding Multithreading Capability to Your Java Applications的更多相关文章

  1. End-to-End Tracing of Ajax/Java Applications Using DTrace

    End-to-End Tracing of Ajax/Java Applications Using DTrace         By Amit Hurvitz, July 2007     Aja ...

  2. Gradle Goodness: Running Java Applications from External Dependency

    With Gradle we can execute Java applications using the JavaExec task or the javaexec() method. If we ...

  3. An HTTP & HTTP/2 client for Android and Java applications OkHttp

    HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP effic ...

  4. [Java Basics] multi-threading

    1, Process&Threads Most implementations of the Java virtual machine run as a single process. Thr ...

  5. Java性能提示(全)

    http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLi ...

  6. Java Swing interview

    http://www.careerride.com/Swing-AWT-Interview-Questions.aspx   Swing interview questions and answers ...

  7. 115 Java Interview Questions and Answers – The ULTIMATE List--reference

    In this tutorial we will discuss about different types of questions that can be used in a Java inter ...

  8. Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference

    Java Performance Optimization by: Pierre-Hugues Charbonneau reference:http://refcardz.dzone.com/refc ...

  9. Top 25 Most Frequently Asked Interview Core Java Interview Questions And Answers

    We are sharing 25 java interview questions , these questions are frequently asked by the recruiters. ...

随机推荐

  1. perl环境配置以及Eclipse安装perl开发插件

    简介: 这篇文章将详细介绍 EPIC 组件的安装,EPIC 编辑环境,调试运行环境,着重介绍如何使用 EPIC 来快速.简便.准确地调试 Perl 语言程序,包括对于 Perl 程序的单步执行,断点用 ...

  2. Http中Cookie与Set-Cookie头

    [原文:http://hi.baidu.com/qinglvzhuye/item/6664a807bb8be3dd73e676d6] android 获取 cookies 有很多办法,但是记住了. h ...

  3. Datawindow.net 子数据窗口出错

    devexpress通过标签页面打开用户控件,数据窗口嵌入用户控件中.当点击数据窗口含下拉数据窗口字段时出现如下错误: 未处理 System.NullReferenceException Messag ...

  4. php curl简单使用

    使用PHP的cURL库可以简单和有效地去抓网页,您只需要运行一个脚本,然后分析一下您所抓取的网页,然后就可以以程序的方式得到您想要的数据了.无论是您想从一个链接上取部分数据,或是取一个XML文件并把其 ...

  5. MYSQL性能查看(命中率,慢查询)

    网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...

  6. js获取浏览器高度和宽度值,尽量的考虑了多浏览器。

    js获取浏览器高度和宽度值,尽量的考虑了多浏览器. IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ...

  7. JAVA & Android 系统环境变量配置

    Java JAVA_HOME:C:\Program Files\Java\jdk1.7.0_40 CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\ ...

  8. 关于python中的__new__方法

    在上篇中,简单的比较了下new方法和init方法,然后结合网上的东西看了一点,发现..看书有的时候说的并不全面. __new__方法是一个类方法,主要作用是来指导如何生成类的实例, 主要用于,当需要生 ...

  9. 【LeetCode】7 & 8 - Reverse Integer & String to Integer (atoi)

    7 - Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Notic ...

  10. 前端架构:Angular与requirejs集成实践

    这几天angular与requirejs.browserify的集成弄的博主头好晕,今天终于成功集成了requirejs,现写些心得体会在这里. 核心思想:angular加载时有一定的顺序,必须依次加 ...