在JAVA中需要使用中断方法的实际情况是什么?

在JAVA中需要使用中断方法的实际情况是什么?,java,multithreading,Java,Multithreading,在JAVA中需要使用中断方法的实际情况是什么?有一些例子,大多数都涉及到关闭线程的意图。如果要中断线程,则需要它 一个例子可能是发生了一个异常,对常规执行有一些异常。您希望线程立即侦听并处理新情况 或者,如果要关闭线程。然后,您可以使用中断来确保线程对您的关机调用作出反应,并且在几秒钟左右的时间内不会继续休眠 或者想象一下,一个应用程序安装一个大约需要10分钟的程序。您可能需要一个取消按钮,该按钮中止安装过程。然后,分配给该按钮的方法可以在引擎盖下使用中断,以确保该过程及时取消 如果我们将其

在JAVA中需要使用中断方法的实际情况是什么?

有一些例子,大多数都涉及到关闭线程的意图。如果要中断线程,则需要它


一个例子可能是发生了一个异常,对常规执行有一些异常。您希望线程立即侦听并处理新情况

或者,如果要关闭线程。然后,您可以使用中断来确保线程对您的关机调用作出反应,并且在几秒钟左右的时间内不会继续休眠

或者想象一下,一个应用程序安装一个大约需要10分钟的程序。您可能需要一个取消按钮,该按钮中止安装过程。然后,分配给该按钮的方法可以在引擎盖下使用
中断
,以确保该过程及时取消


如果我们将其分解,那么它只是一个可以设置和检查的常规标志。您可以使用
Thread#interrupt
设置它,并通过
Thread#isInterrupted
检查它

Java库中有多种方法已经使用了此标志,如
Thread#sleep
,如果在睡眠时设置了该标志,则会抛出
InterruptedException


以下是一个小展示示例:

public class Waiter extends Thread {
    private volatile boolean mShouldStop = false;

    @Override
    public void run() {
        while (!this.mShouldStop) {
            System.out.println("Still there!");

            try {
                // Sleep for 10 seconds
                Thread.sleep(10_000);
            } catch (final InterruptedException e) {
                // Abort sleeping, got interrupted.
            }
        }

        System.out.println("Shutting down!");
    }

    public void shutdown() {
        this.mShouldStop = true;
    }
}
以及用法:

public class Demo {
    public static void main(final String[] args) throws InterruptedException {
        // Create and start the thread
        final Waiter waiter = new Waiter();
        System.out.println("Start");
        waiter.start();

        // Wait some seconds
        Thread.sleep(25_000);

        // Stop the thread, use interrupt to wake it up in case it slept
        System.out.println("Kindly ask for shutdown");
        waiter.shutdown();

        System.out.println("Interrupt it");
        waiter.interrupt();
    }
}
如果没有中断,线程只会在睡眠结束后对关机调用作出反应
,因此还需要5秒钟


需要注意的是:
volatile
关键字确保线程更改对象后,所有线程都将获取更新的变量,而不会处理较旧的缓存变量。

有一些示例,大多数示例都涉及打算关闭线程。如果要中断线程,则需要它


一个例子可能是发生了一个异常,对常规执行有一些异常。您希望线程立即侦听并处理新情况

或者,如果要关闭线程。然后,您可以使用中断来确保线程对您的关机调用作出反应,并且在几秒钟左右的时间内不会继续休眠

或者想象一下,一个应用程序安装一个大约需要10分钟的程序。您可能需要一个取消按钮,该按钮中止安装过程。然后,分配给该按钮的方法可以在引擎盖下使用
中断
,以确保该过程及时取消


如果我们将其分解,那么它只是一个可以设置和检查的常规标志。您可以使用
Thread#interrupt
设置它,并通过
Thread#isInterrupted
检查它

Java库中有多种方法已经使用了此标志,如
Thread#sleep
,如果在睡眠时设置了该标志,则会抛出
InterruptedException


以下是一个小展示示例:

public class Waiter extends Thread {
    private volatile boolean mShouldStop = false;

    @Override
    public void run() {
        while (!this.mShouldStop) {
            System.out.println("Still there!");

            try {
                // Sleep for 10 seconds
                Thread.sleep(10_000);
            } catch (final InterruptedException e) {
                // Abort sleeping, got interrupted.
            }
        }

        System.out.println("Shutting down!");
    }

    public void shutdown() {
        this.mShouldStop = true;
    }
}
以及用法:

public class Demo {
    public static void main(final String[] args) throws InterruptedException {
        // Create and start the thread
        final Waiter waiter = new Waiter();
        System.out.println("Start");
        waiter.start();

        // Wait some seconds
        Thread.sleep(25_000);

        // Stop the thread, use interrupt to wake it up in case it slept
        System.out.println("Kindly ask for shutdown");
        waiter.shutdown();

        System.out.println("Interrupt it");
        waiter.interrupt();
    }
}
如果没有中断,线程只会在睡眠结束后对关机调用作出反应
,因此还需要5秒钟


需要注意的是:
volatile
关键字确保线程更改对象后,所有线程都将获取更新的变量,而不会处理较旧的缓存变量。

如果您询问-可能不需要如果您询问-可能不需要
mShouldStop
变量必须声明为
volatile
!(除此之外,还有一个令人信服的答案,+1。您可能需要添加“高级”用例:一些计算正在运行,需要10分钟,GUI显示一个进度条。在这种情况下,有一个“取消”按钮总是很好的。然后可以通过在引擎盖下调用
中断
来实现该按钮)好主意,将包括这一点。这通常是正确的想法。但是示例并不好。您可以编辑答案并包括更好的示例,或者两者一起使用。
mShouldStop
变量必须声明为
volatile
!(除此之外,还有一个令人信服的答案,+1。您可能需要添加“高级”用例:一些计算正在运行,需要10分钟,GUI显示一个进度条。在这种情况下,有一个“取消”按钮总是很好的。然后可以通过在引擎盖下调用
中断
来实现该按钮)好主意,将包括这一点。这通常是正确的想法。但是这个例子并不好。你可以编辑答案并加入一个更好的例子,或者两者一起。