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

暂停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调试接口来完成,但我发现,如果您知道为什么需要它,您通常可以找到不同的解决方案。好的,我真的希望有更好的方法来处理这一问题。。。我想那就是我要做的。。谢谢好吧,我真的希望有更好的方法来解决这个问题。。。我想那就是我要做的。。谢谢