java - Java - 使用线程启动 - 暂停 - 停止微型编程世界
问题描述
我仍然难以正确使用线程。我知道如何开始一个的基本要点,但我遇到的最大问题是暂停 - 一起恢复和停止它们。每当我尝试停止运行可能包含循环的主方法的模拟线程时,我需要能够在我的 GUI 中使用按钮暂停该线程。暂停和停止线程总是会导致整个 GUI 冻结,因此不可能。
我将我的 Gui 控制器连接到 Simulation Manager 类,该类基于给定的 class1 和 class2 创建一个新的模拟。该管理器应跟踪当前状态并使用模拟类中的线程(扩展线程)。
public void startProg() {
if(simulation == null){
simulation = new Simulation (class1, class2, this);
}
if(state.getState () == SimulationsStatus.PAUSE){
simulation.resumeProg (); -- Basically where i call the Simulation object to resume / start
System.out.println ("startProg-resume" );
...
}
我的模拟是这样开始的:
public synchronized void startSimulation() {
s = new Simulation (class1,class2,simulationManager); --- Wether i assign my Simulation s to a
--- new one or the current object this is in does not change the outcome
s.start ( );
}
在那个类中,我有 4 个方法,启动、恢复、暂停和停止,它们应该对线程本身做命名的事情。我不知道如何让当前线程停止而不冻结程序本身。
这是该线程对象的 run 方法,如果用户在我的 gui 中以这种方式设计其代码,则 main 方法可以包含无限循环,因此 pause 和 stop 方法应该能够暂停和停止线程,即使它当前正在计算某些东西
@Override
public synchronized void run() {
try {
class1.main ( );
} catch (Exception e) {
System.out.println (e.getStackTrace ( ));
}
}
任何提示都非常感谢
目前我正在使用观察者模式在设定的时间内“冻结”线程,以便 class1 在屏幕上以固定速度移动
解决方案
JVM不支持停止线程和暂停/恢复线程,但不支持其中运行的代码。
例如,参见Thread.stop 上的文档。
如果您想运行您不知道或不信任的代码并希望对其进行控制,请在其自己的 VM 中运行它,最好是在虚拟机环境中。这样你就可以控制虚拟机了。
推荐阅读
- java - 如何使数组的前半部分是从 0 到 7 的随机整数,后半部分是数组前半部分的随机成员,但只能选择一次
- swift - Swift 中的 createDirectory(at:withIntermediateDirectories:attributes:) 是原子的吗
- php - 内置函数的 ReflectionFunction 返回类型为 null
- node.js - 如何检测 webpack 在重新编译时使用了哪个编译选项
- html - setValue in formArray angular 8 并显示 ui
- vue.js - Vue + SWPrecacheWebpackPlugin - app.js 未缓存
- django-rest-framework - 一个用户登录和另一个用户的访问令牌
- javascript - 提交表单时的奇怪行为,它同时提交和删除
- git - 已放弃连接。致命:无法从远程存储库中读取
- python - scikit-learn 中 ColumnTransformer 的自定义转换器问题