首页 > 解决方案 > 确保java线程真的被挂起

问题描述

我有以下课程:

public class PawnThread implements Runnable {

    public void start() {
        thread.start();
    }

    @Override
    public void run() {
        try {
            while (... some finish condition ...) {
                move();
                synchronized (this) {
                    while (suspendFlag) {
                        wait();
                    }
                }
            }
        } catch (InterruptedException e) {
            System.err.println(pawn.toString() + ": thread interrupted :(");
        }
    }

    void move() {
        ... some blocking actions
    }

    synchronized void suspend() {
        suspendFlag = true;
    }

    synchronized void resume() {
        suspendFlag = false;
        notify();
    }
}

现在我有一个它的对象列表:

private final List<PawnThread> pawnThreadList;

我定义了一些辅助方法来暂停所有这些:

public void suspendAll() {
   pawnThreadList.forEach(PawnThread::suspend);
}

现在suspend()方法只是关于改变标志。要求是,当我离开suspendAll()方法时,所有线程都应该实际暂停(它们不能处于RUNNABLE状态) - 现在不是这种情况,因为对于其中一些线程来说,在暂停之前可能需要一些时间才能真正完成他们的工作.

对于这个解决方案的正确设计,我将不胜感激。

问候

标签: javamultithreadingwaitnotifysuspend

解决方案


这个要求是不可能满足的,但也是没有意义的。为了让线程传达它已挂起的事实,线程必须正在运行。无法确保线程已完成挂起过程。

但这也不是一个明智的要求。线程是否已经挂起或将要挂起自己又有什么关系呢,只要它除了挂起自己之外别无他法吗?

通过让每个线程在某处设置一些指示它已接收到挂起请求并即将停止执行,应该满足一个合理的要求。然后调用线程可以等待所有线程提供该指示。


推荐阅读