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()
方法,但它已被弃用,并且不是您想要使用的。立即停止通常是个坏主意。最后,你可能会在某个关键事件中间中止一个线程。这就是为什么最好由线程本身决定何时是中断的适当时间。