Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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_Thread Safety_Java Threads_Legacy - Fatal编程技术网

如何在java线程';她在跑步

如何在java线程';她在跑步,java,multithreading,thread-safety,java-threads,legacy,Java,Multithreading,Thread Safety,Java Threads,Legacy,在阅读了几篇关于如何杀死Java线程的SO文章后,我非常理解为什么停止是不安全的,以及如何处理优雅的停止 但是解决方案的目标是UI线程,在UI线程中,重新绘制是一个问题,而不是由线程执行的长时间运行的阻塞过程 链接: 我无法从解决方案或示例中理解的一点是,样本试图模拟的长期运行部分是什么 在下面的代码中,如果我将间隔设置为INT.MAX呢 public void run() { Thread thisThread = Thread.currentThread();

在阅读了几篇关于如何杀死Java线程的SO文章后,我非常理解为什么停止是不安全的,以及如何处理优雅的停止

但是解决方案的目标是UI线程,在UI线程中,重新绘制是一个问题,而不是由线程执行的长时间运行的阻塞过程

链接:

我无法从解决方案或示例中理解的一点是,样本试图模拟的长期运行部分是什么

在下面的代码中,如果我将间隔设置为INT.MAX呢

public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);  // This might take forever to complete, 
                                             // and while may never be executed 2nd time.

                synchronized(this) {
                    while (threadSuspended && blinker==thisThread)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

    public synchronized void stop() {
        blinker = null;
        notify();
    }
我要求使用这个用例的原因是,我在一个遗留代码库中有一个bug,它在一个线程中运行另一个可执行文件。
现在,如果询问用户是否希望停止线程,我们将需要终止该线程,并且作为该线程一部分的可执行文件将自动终止。

终止线程的方法是请求它(很好地)停止。这取决于线程正在运行的代码来侦听该请求并对其执行操作

具体地说,您这样做的方式是中断线程。您的代码检查中断-
线程。如果线程在执行之前或执行期间中断,sleep
对象。wait
将抛出
InterruptedException
;但是你抓住了干扰,忽略它,所以你不会采取行动

与此相反:

while (condition) {
  try {
    Thread.sleep(...);

    wait();
  } catch (InterruptedException e) {
  }
}
将中断置于循环之外:

try {
  while (condition) {
    Thread.sleep(...);
    wait();
  }
} catch (InterruptedException e) {
}

如果循环被中断,那么它将终止。

停止线程的方法是要求它很好地停止。这取决于线程正在运行的代码来侦听该请求并对其执行操作

具体地说,您这样做的方式是中断线程。您的代码检查中断-
线程。如果线程在执行之前或执行期间中断,sleep
对象。wait
将抛出
InterruptedException
;但是你抓住了干扰,忽略它,所以你不会采取行动

与此相反:

while (condition) {
  try {
    Thread.sleep(...);

    wait();
  } catch (InterruptedException e) {
  }
}
将中断置于循环之外:

try {
  while (condition) {
    Thread.sleep(...);
    wait();
  }
} catch (InterruptedException e) {
}

如果循环被中断,则循环终止。

代替Thread.Sleep,如果有一个同步API调用,超时设置为1小时,此操作是否仍然会被中断?该API调用必须侦听中断并对其采取行动,方式与
Thread.Sleep
完全相同。谢谢Andy。。。。在我的例子中,被调用的任务或进程(线程运行的长时间运行的方法)没有侦听中断或取消逻辑。虽然我愿意将代码从一个线程移动到另一个执行器,但我的团队中很少有人认为线程仍然可以从其运行范围之外中断。或者,我理解错了……在执行器中执行代码并不能使其神奇地取消。你所能做的就是请求取消。有一个你预计需要一个小时才能完成的事情,却不能取消,这是一个糟糕的主意。@Raghav如果代码没有提供取消它的方法,那么它就不能取消。如果无法修改代码,则必须让其运行,或者将其放入自己的进程中并终止该进程。支持清除取消很复杂,如果不将其设计到代码中,就无法将其强制到代码中。如果有一个同步API调用,超时设置为1小时,那么此操作是否仍然会被中断?该API调用必须侦听中断并对其采取行动,与
Thread.sleep
完全相同。谢谢安迪。。。。在我的例子中,被调用的任务或进程(线程运行的长时间运行的方法)没有侦听中断或取消逻辑。虽然我愿意将代码从一个线程移动到另一个执行器,但我的团队中很少有人认为线程仍然可以从其运行范围之外中断。或者,我理解错了……在执行器中执行代码并不能使其神奇地取消。你所能做的就是请求取消。有一个你预计需要一个小时才能完成的事情,却不能取消,这是一个糟糕的主意。@Raghav如果代码没有提供取消它的方法,那么它就不能取消。如果无法修改代码,则必须让其运行,或者将其放入自己的进程中并终止该进程。支持干净的取消是复杂的,如果不将其设计成代码,就不能强制将其编入代码中。