在JAVA中需要使用中断方法的实际情况是什么?
在JAVA中需要使用中断方法的实际情况是什么?有一些例子,大多数都涉及到关闭线程的意图。如果要中断线程,则需要它在JAVA中需要使用中断方法的实际情况是什么?,java,multithreading,Java,Multithreading,在JAVA中需要使用中断方法的实际情况是什么?有一些例子,大多数都涉及到关闭线程的意图。如果要中断线程,则需要它 一个例子可能是发生了一个异常,对常规执行有一些异常。您希望线程立即侦听并处理新情况 或者,如果要关闭线程。然后,您可以使用中断来确保线程对您的关机调用作出反应,并且在几秒钟左右的时间内不会继续休眠 或者想象一下,一个应用程序安装一个大约需要10分钟的程序。您可能需要一个取消按钮,该按钮中止安装过程。然后,分配给该按钮的方法可以在引擎盖下使用中断,以确保该过程及时取消 如果我们将其
一个例子可能是发生了一个异常,对常规执行有一些异常。您希望线程立即侦听并处理新情况 或者,如果要关闭线程。然后,您可以使用中断来确保线程对您的关机调用作出反应,并且在几秒钟左右的时间内不会继续休眠 或者想象一下,一个应用程序安装一个大约需要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显示一个进度条。在这种情况下,有一个“取消”按钮总是很好的。然后可以通过在引擎盖下调用中断来实现该按钮)好主意,将包括这一点。这通常是正确的想法。但是这个例子并不好。你可以编辑答案并加入一个更好的例子,或者两者一起。