Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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,我有一个线程a作为GUI或CLI,它生成另一个线程B public void run() { doSomething(); //Might take 30 seconds crazyCalculation(); //Might take 30-60 minutes doTheLastThingBeforeExit(); //Might take another 30 seconds } 我的问题是:是否可以暂停线程A中线程B的执行(到外部(让用户查看日志)分析当前结果)

我有一个线程a作为GUI或CLI,它生成另一个线程B

public void run() {
    doSomething(); //Might take 30 seconds
    crazyCalculation(); //Might take 30-60 minutes
    doTheLastThingBeforeExit(); //Might take another 30 seconds
}
我的问题是:是否可以暂停线程A中线程B的执行(到外部(让用户查看日志)分析当前结果),然后在用户完成分析后恢复线程B?这是否可以在不修改线程B的内容的情况下实现?(实现不推荐使用的Thread.suspend()方法的其他方法)

如果必须修改线程B的内容(我假设使用wait()和notify()),那么它们应该在线程B中的什么位置?我是否应该将crazyCalculation()修改为具有多个阶段,并使用run方法

public void run() {
    doSomething();
    for (int i = 0; i < numberOfStage; i++) {
        crazyCalculationAtStage(i); //Broken down to smaller chunk 1 minute each stage
        synchronized (this) {
            if (isLocked()) {
                 myLock.wait();
            }
        }
    }
    doTheLastThingBeforeExit();
}
public void run(){
doSomething();
for(int i=0;i
“它们应该在线程B中的什么位置”其中,从逻辑上讲,暂停线程是有意义的A线程只能在其协作下暂停。否则,您可能会在它持有关键锁时暂停它,而暂停它的线程需要获取该锁,然后突然出现死锁。请参阅。它还解释了如何在不使用不推荐的方法的情况下实现类似于
suspend()
resume()
的功能。可能吗?对(见上面isnot2bad的评论)好主意?一般来说,no.
t.suspend()
不受欢迎,因为它是在软件中放置死锁bug的一种好方法。你的后台线程是否锁定了任何锁?如果后台线程在UI线程挂起它的时候持有一个或多个锁,会发生什么?前台线程是否有可能尝试获取这些锁中的一个?如果是这样,那就是你的僵局。让一条线强迫另一条线做任何事情从来都不是一个明智的想法。线程应该始终协作。