暂停Java上的线程
给定一个可运行的:暂停Java上的线程,java,multithreading,Java,Multithreading,给定一个可运行的: public class MyRunnable implements Runnable { public void run() { doA(); for (i=0; i<18123 ; i++) { doB(); } doC(); } } 其中,doA、B、C分别定义为大约100行代码 让线程冻结的最好方法是什么——不管它在哪一行代码中——然后从它最后停止
public class MyRunnable implements Runnable {
public void run() {
doA();
for (i=0; i<18123 ; i++) {
doB();
}
doC();
}
}
其中,doA、B、C分别定义为大约100行代码
让线程冻结的最好方法是什么——不管它在哪一行代码中——然后从它最后停止的下一行代码继续
我在网上搜索,我看到了这里
他们建议使用布尔值,这是否意味着我需要在每几行代码之后检查布尔值?一定有更好的方法…因为Thread.suspend和Thread.resume已被弃用,所以通常无法工作: Thread.suspend本质上易于死锁。如果目标线程在监视器上持有一个锁,在监视器挂起时保护关键系统资源,则在目标线程恢复之前,任何线程都不能访问该资源。如果将恢复目标线程的线程在调用resume之前尝试锁定此监视器,则会导致死锁。这种死锁通常表现为冻结的进程 如果您绝对需要这种行为,您必须自己显式地实现它 这些实现可能看起来像未经测试或编译的代码: public abstract class SafeStoppableRunnable implements Runnable { private boolean stopped = false; public synchronized void stopSafe() { this.stopped = true; } public synchronized void resumeSafe() { this.stopped = false; synchronized(this) { this.notifyAll(); } } protected synchronized void waitWhenStopped() { while(this.stopped) { this.wait(); } } }
然后,可停止的Runnable应该扩展SafeStoppableRunnable,并在程序中的所有点上调用waitWhenStopped方法。可停止点可能是程序不保存全局资源的点,其他线程需要进行处理。由于Thread.suspend和Thread.resume的原因,通常无法工作的点已被弃用: Thread.suspend本质上易于死锁。如果目标线程在监视器上持有一个锁,在监视器挂起时保护关键系统资源,则在目标线程恢复之前,任何线程都不能访问该资源。如果将恢复目标线程的线程在调用resume之前尝试锁定此监视器,则会导致死锁。这种死锁通常表现为冻结的进程 如果您绝对需要这种行为,您必须自己显式地实现它 这些实现可能看起来像未经测试或编译的代码: public abstract class SafeStoppableRunnable implements Runnable { private boolean stopped = false; public synchronized void stopSafe() { this.stopped = true; } public synchronized void resumeSafe() { this.stopped = false; synchronized(this) { this.notifyAll(); } } protected synchronized void waitWhenStopped() { while(this.stopped) { this.wait(); } } }
然后,可停止的Runnable应该扩展SafeStoppableRunnable,并在程序中的所有点上调用waitWhenStopped方法。可停止点可能是程序不保存全局资源的点,其他线程需要进行处理。多线程系统非常复杂。多线程编程的黄金法则是避免任何可能提高系统熵水平的代码。模糊的系统状态是不可能预测和跟踪的 在某个不可预测的行上暂停的线程是多线程程序员的噩梦。在开发时,在未知线路上唤醒线程后,根本不可能确保系统正常工作。你就是不能跟踪所有的选择。这将100%导致生产中出现各种奇怪的缺陷
在线程中添加两个确定的暂停点是唯一的方法。多线程系统非常复杂。多线程编程的黄金法则是避免任何可能提高系统熵水平的代码。模糊的系统状态是不可能预测和跟踪的 在某个不可预测的行上暂停的线程是多线程程序员的噩梦。在开发时,在未知线路上唤醒线程后,根本不可能确保系统正常工作。你就是不能跟踪所有的选择。这将100%导致生产中出现各种奇怪的缺陷
在线程中添加两个确定的暂停点是唯一的方法。为什么需要暂停它?通常这是调试器的一项功能,您可以使用Java调试接口来完成,但我发现,如果您知道为什么需要它,您通常可以找到不同的解决方案。为什么需要挂起它?通常这是调试器的一项功能,您可以使用Java调试接口来完成,但我发现,如果您知道为什么需要它,您通常可以找到不同的解决方案。好的,我真的希望有更好的方法来处理这一问题。。。我想那就是我要做的。。谢谢好吧,我真的希望有更好的方法来解决这个问题。。。我想那就是我要做的。。谢谢