0

我是 Java concurrecny 的新手,目前正在阅读:Java Tutorial-Interrupts但我真的不明白我应该在哪里以及为什么应该使用中断。有人可以给我一个例子(代码),以便我更好地理解它吗?谢谢

4

3 回答 3

3

当您想要(咳嗽)中断线程时使用中断 - 通常意味着停止运行。 Thread.stop()由于各种问题已被弃用,因此Thread.interrupt()您告诉线程它应该停止运行的方式也是如此——它应该清理它正在做的事情并退出。实际上,程序员可以以任何他们想要的方式在线程上使用中断信号。

一些例子:

  • 您的线程可能会休眠一分钟,然后爬取网页。您希望它停止这种行为。
  • 也许您有一个线程正在从作业队列中消耗,并且您想告诉它没有更多的作业即将到来。
  • 也许您有许多后台线程要中断,因为进程正在关闭并且您想要干净地这样做。

当然有很多方法可以完成上述信令,但可以使用中断。

影响正在运行的线程的更强大的方法之一是从几个不同的方法Thread.interrupt()中抛出,包括、和其他方法。InterruptedExceptionThread.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
}
于 2012-09-11T20:59:34.593 回答
1

对于多线程,其想法是您将一些工作分配给多个线程。典型的例子是有一个线程来执行后台计算或后台操作,例如服务器查询,这将花费相当长的时间而不在​​处理用户界面的主线程中执行该操作。

通过卸载那些可能需要大量时间的操作,您可以防止用户界面看起来卡住。例如,当您在显示的对话框中启动操作时,转到另一个窗口然后返回到显示的对话框,并且当您单击对话框时对话框不会自行更新。

有时需要停止后台活动。在这种情况下,您将使用 Thread.interrupt() 方法来请求线程自行停止。

例如,如果您有一个客户端每秒从服务器获取一次状态信息。后台线程处理与服务器的通信并获取数据。用户界面线程获取数据并更新显示。然后用户按下显示屏上的停止或取消按钮。然后,用户界面线程对后台线程进行中断,以便停止从服务器请求状态信息。

于 2012-09-11T21:06:53.117 回答
0

在并发编程中,许多程序员得出的结论是他们需要停止一个线程。他们认为有某种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
        }
    }
 }
于 2012-09-11T21:07:28.593 回答