Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中中断线程_Java_Multithreading_Interrupt_Future - Fatal编程技术网

在java中中断线程

在java中中断线程,java,multithreading,interrupt,future,Java,Multithreading,Interrupt,Future,我发现这个解决方案是为了知道线程是否被中断 public class OurThread extends Thread(){ private volatile boolean stop = false; public void run(){ while (!stop) { //Do your actions } } } 但是我的run方法只执行一次,所以把它放在一个while循环中是没有意义的。我发现的另一种

我发现这个解决方案是为了知道线程是否被中断

public class OurThread extends Thread(){
    private volatile boolean stop = false;
    public void run(){
        while (!stop) {
             //Do your actions
        }
     }
 }
但是我的run方法只执行一次,所以把它放在一个while循环中是没有意义的。我发现的另一种方法是检查Thread.isInterrupted()标志,然后终止线程。我的run()方法相当长,因此我必须多次检查这种情况,使我的代码变脏

我必须把它应用到四个不同的过程中,所以我试图找到一个更简单,更干净的方法。我想知道是否有这样的事情:

try{//my code}
catch(interrumption)
问题是,由于使用future.cancel()对我的线程进行了中断,因此中断不会在run()代码中抛出,因此我也不能这样做

有什么建议吗? 到现在为止,如果线程被取消,我会在代码之间检查很多次。
谢谢:)

首先,不要扩展线程,应该实现Runnable或Callable

其次,您可以添加如下方法

static void checkInterrupt() {
    if(Thread.currentThread().isInterrupted()) 
         throw new IllegalStateException("Interrupted");
}
把这个放在四个地方。这不会添加太多代码,也不像一个不会停止的任务那么难看。

您的任务(可运行或可调用)不能被中断,除非它有内置的机制来响应中断。也取决于你的设计;比如,当任务预期被中断时。通常,我们在任务达到安全状态时执行此操作


所以,您检查是否接收到中断,然后做出适当的响应。要重用代码,您可以使用@Peter.建议的方法。

还有一个
Thread
类的静态方法,
Thread.interrupted()
+1。也许可以解释一下,实现
Runnable
是另一种选择?另外,为什么
IllegalStateException
?它是一个运行时,而不是一个必须声明或捕获的检查异常。非法状态意味着它由于状态而无法继续,在这种情况下设置了中断标志。我已经实现了runnable,问题是future.cancel()试图中断我的线程,但大多数情况下它无法继续,因此我必须以较低的速度中断它level@PeterLawrey整洁,我喜欢。预计随时都会结束。我正在构建一个流程的管理面板,可以选择强制流程结束。您可以将您的运行方法划分为多个较小的模块或子任务(即分为多个运行)。这样你就可以很容易地检查是否有中断,并且只有在安全的情况下才能继续。这正是我试图避免的。我需要马上结束这个过程。我试试看会发生什么