我是 Java concurrecny 的新手,目前正在阅读:Java Tutorial-Interrupts但我真的不明白我应该在哪里以及为什么应该使用中断。有人可以给我一个例子(代码),以便我更好地理解它吗?谢谢
3 回答
当您想要(咳嗽)中断线程时使用中断 - 通常意味着停止运行。 Thread.stop()
由于各种问题已被弃用,因此Thread.interrupt()
您告诉线程它应该停止运行的方式也是如此——它应该清理它正在做的事情并退出。实际上,程序员可以以任何他们想要的方式在线程上使用中断信号。
一些例子:
- 您的线程可能会休眠一分钟,然后爬取网页。您希望它停止这种行为。
- 也许您有一个线程正在从作业队列中消耗,并且您想告诉它没有更多的作业即将到来。
- 也许您有许多后台线程要中断,因为进程正在关闭并且您想要干净地这样做。
当然有很多方法可以完成上述信令,但可以使用中断。
影响正在运行的线程的更强大的方法之一是从几个不同的方法Thread.interrupt()
中抛出,包括、和其他方法。InterruptedException
Thread.sleep()
Object.wait()
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// i've been interrupted
// catching InterruptedException clears the interrupt status on the thread
// so a good pattern is to re-interrupt the thread
Thread.currentThread().interrupt();
// but maybe we want to just kill the thread
return;
}
此外,通常在一个线程中,我们正在循环执行某些任务,因此我们检查中断状态:
while (!Thread.currentThread().isInterrupted()) {
// keep doing our task until we are interrupted
}
对于多线程,其想法是您将一些工作分配给多个线程。典型的例子是有一个线程来执行后台计算或后台操作,例如服务器查询,这将花费相当长的时间而不在处理用户界面的主线程中执行该操作。
通过卸载那些可能需要大量时间的操作,您可以防止用户界面看起来卡住。例如,当您在显示的对话框中启动操作时,转到另一个窗口然后返回到显示的对话框,并且当您单击对话框时对话框不会自行更新。
有时需要停止后台活动。在这种情况下,您将使用 Thread.interrupt() 方法来请求线程自行停止。
例如,如果您有一个客户端每秒从服务器获取一次状态信息。后台线程处理与服务器的通信并获取数据。用户界面线程获取数据并更新显示。然后用户按下显示屏上的停止或取消按钮。然后,用户界面线程对后台线程进行中断,以便停止从服务器请求状态信息。
在并发编程中,许多程序员得出的结论是他们需要停止一个线程。他们认为有某种boolean
标志来告诉线程它应该停止是一个好主意。中断标志是通过 Java 标准库提供的布尔机制。
例如:
class LongIterativeTask implements Runnable {
public void run() {
while (!thread.isInterrupted()) { //while not interrupted
//do an iteration of a long task
}
}
}
class LongSequentialTask implements Runnable {
public void run() {
//do some work
if (!thread.isInterrupted()) { //check flag before starting long process
//do a lot of long work that needs to be done in one pass
}
// do some stuff to setup for next step
if (!thread.isInterrupted()) { //check flag before starting long process
//do the next step of long work that needs to be done in one pass
}
}
}