Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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 - Fatal编程技术网

Java 我该如何中断线程?

Java 我该如何中断线程?,java,multithreading,interrupt,Java,Multithreading,Interrupt,我正试图弄清楚如何中断线程。我知道以前有人问过这个问题,但我不确定我是否理解正确 我目前有: public class Test implements Runnable { public void run() { int i = 0; while(!Thread.currentThread().isInterrupted() && i < 100) { System.out.println(i++);

我正试图弄清楚如何中断线程。我知道以前有人问过这个问题,但我不确定我是否理解正确

我目前有:

public class Test implements Runnable {
    public void run() {
        int i = 0;
        while(!Thread.currentThread().isInterrupted() && i < 100) {
            System.out.println(i++);
        }
    }
    public static void main(String args[]) {
        Thread x = new Thread(new Test());
        x.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(i+100);
            if (i == 75) {
                x.interrupt();
            }
        }
    }
}
公共类测试实现可运行{
公开募捐{
int i=0;
而(!Thread.currentThread().isInterrupted()&&i<100){
System.out.println(i++);
}
}
公共静态void main(字符串参数[]){
螺纹x=新螺纹(新测试());
x、 start();
对于(int i=0;i<100;i++){
系统输出打印项次(i+100);
如果(i==75){
x、 中断();
}
}
}
}
这两个线程都计数为100。这是一个简单的例子,我知道,但我突然想到,如果我在
run
方法中做一些更复杂的事情,那么外部的while循环可能不够好。所以我想问的是:

例如,如果我在
run
方法中有50行代码,并且我想在这50行代码中的任何位置中断线程,那么我是否需要加载
If
s来检查每行代码之间是否没有中断?就我目前对整个事情的理解而言,情况就是这样……这让我觉得我错过了什么


谢谢您的帮助:)

您的理解是正确的-
中断
是为了合作而不是先发制人的中断。由目标线程决定何时可以安全地中断,并在此时进行适当的检查。如果线程在被阻塞时被中断,某些阻塞操作将抛出
InterruptedException
,但除此之外,您可以根据需要检查
thread.interrupted()
。在大多数算法中,您不希望允许在任意点中断,但只允许在定义良好的位置中断,您知道这些位置的状态将是一致的


请注意,您应该使用
Thread.interrupted()
而不是
Thread.currentThread().isInterrupted()
进行检查,因为前者在检查后会重置中断标志。一旦
中断
返回true,它将在每次调用时继续返回true,直到标志被重置,这可能不是您想要的。

补充了Ian Roberts已经说过的内容

如果您没有编写顶级应用程序(即,如果您正在编写的代码将被其他任何人调用),那么只有一种合理的方法来处理
中断异常

  • 安全地中止来电者要求您执行的任何操作
  • 如果您的呼叫方希望这样做,请确保将事情保持在呼叫方可以启动新操作的状态,并且
  • 重新抛出中断异常
以其他方式运行的代码可能会让调用它的人感到惊讶,而让调用方感到惊讶从来都不是一个好主意


如果您正在编写顶级应用程序,请继续以任何适合您的方式处理
InterruptedException
。(只希望你调用的库不会做任何让你惊讶的事情。)

以下是可能的:是的,你的理解是正确的。实际上,您可能不希望在每行代码之间都允许中断。因此,您可以选择适当的位置来允许中断生效。@sstan好的,我想这是有道理的……似乎没有一种即时终止方法是很奇怪的。@abarnybox基本上您希望忘记能够在某个确切的位置中断线程的概念。别担心,很多程序都是在不需要的情况下编写的。有一个
stop()
方法,但它已被弃用,并且不是您想要使用的。立即停止通常是个坏主意。最后,你可能会在某个关键事件中间中止一个线程。这就是为什么最好由线程本身决定何时是中断的适当时间。