java - 确保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
状态) - 现在不是这种情况,因为对于其中一些线程来说,在暂停之前可能需要一些时间才能真正完成他们的工作.
对于这个解决方案的正确设计,我将不胜感激。
问候
解决方案
这个要求是不可能满足的,但也是没有意义的。为了让线程传达它已挂起的事实,线程必须正在运行。无法确保线程已完成挂起过程。
但这也不是一个明智的要求。线程是否已经挂起或将要挂起自己又有什么关系呢,只要它除了挂起自己之外别无他法吗?
通过让每个线程在某处设置一些指示它已接收到挂起请求并即将停止执行,应该满足一个合理的要求。然后调用线程可以等待所有线程提供该指示。
推荐阅读
- android - 如何在 android 谷歌地图活动中显示两点之间的路径?
- angular - 如何处理 Angular 8 应用程序中的互联网不稳定?
- android - 通过android中的代码获取单个Application消耗的内存和Data
- java - 如何禁用 JTable 编辑?
- angular - 未捕获的错误:无法解析 ContactComponent 的所有参数:(?)
- php - PHP仅从函数中提取用户并使用forech插入db通知表
- airflow - 气流:如何修改 DAG 以回填?
- c# - 在 asp.net mvc5 中的多供应商电子商务商店中,根据商店订单限制计算购物车中的商店折扣
- javascript - 可以在es6中将css文件作为字符串导入吗?
- apache-spark - Spark kafka流无法确定分区的位置