如何在java线程';她在跑步
在阅读了几篇关于如何杀死Java线程的SO文章后,我非常理解为什么停止是不安全的,以及如何处理优雅的停止 但是解决方案的目标是UI线程,在UI线程中,重新绘制是一个问题,而不是由线程执行的长时间运行的阻塞过程 链接: 我无法从解决方案或示例中理解的一点是,样本试图模拟的长期运行部分是什么 在下面的代码中,如果我将间隔设置为INT.MAX呢如何在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();
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如果代码没有提供取消它的方法,那么它就不能取消。如果无法修改代码,则必须让其运行,或者将其放入自己的进程中并终止该进程。支持干净的取消是复杂的,如果不将其设计成代码,就不能强制将其编入代码中。