Java 线程对另一个线程有影响?
因此,我想制作一个任务列表,每个任务都有一个内置计时器,用于培训目的。我的想法是,我可以启动一个顶级任务,在该任务的计时器完成后,如果子任务已附加到顶级任务,则将启动一个子任务。我使用JavaSwing提供了一个可以启动任务的GUI。每个任务都应该创建自己的myJava 线程对另一个线程有影响?,java,multithreading,Java,Multithreading,因此,我想制作一个任务列表,每个任务都有一个内置计时器,用于培训目的。我的想法是,我可以启动一个顶级任务,在该任务的计时器完成后,如果子任务已附加到顶级任务,则将启动一个子任务。我使用JavaSwing提供了一个可以启动任务的GUI。每个任务都应该创建自己的myTimer类实例,用于测量任务的持续时间。TaskObject类通过startTask()启动计时器 问题是: 当我附加子任务时,子任务将启动,但其计时器在完成后不会停止。它到达while循环的末尾,但不知何故它不断地进入和离开循环,我不
Timer
类实例,用于测量任务的持续时间。TaskObject
类通过startTask()
启动计时器
问题是:
当我附加子任务时,子任务将启动,但其计时器在完成后不会停止。它到达while循环的末尾,但不知何故它不断地进入和离开循环,我不知道这是为什么。单是顶级任务就可以运行得很好。计时器在给定的持续时间后停止。也许你能帮我一下
提前谢谢!以下是我的代码的简短版本:
public class Timer {
private Thread watchThread;
private long deltaTime;
private volatile boolean run;
private long time1, time2;
ITaskObject task;
public Timer(ITaskObject task){
super();
this.deltaTime = 0;
this.run = false;
this.task = task;
}
public void start(){
createThread();
run = true;
watchThread.start();
}
public void stop(){
watchThread.interrupt();
run = false;
}
public void reset(){
run = false;
time1 = 0;
deltaTime = 0;
}
private void createThread(){
watchThread = new Thread(() -> {
time1 = System.currentTimeMillis();
while(run){
time2 = System.currentTimeMillis();
deltaTime = time2 - time1;
task.addTime((double)deltaTime);
time1 = time2;
}
});
}
}
如果
addTime
方法发现当前任务超时,它将始终调用startSubtask
方法。这意味着它不断地告诉子任务开始,甚至在子任务已经完成之后
我建议做的是在addTime
方法中检查子任务的状态:如果子任务
已停止,则不要再次启动它,因为它已运行:
@Override
public void addTime(double millis) {
currentMillis += millis;
if (currentMillis >= millisMax) {
stopTask();
currentMillis = millisMax;
// Only start the subtask if it is new or has been reset
if (subtask.state == State.UNDEF) {
startSubtask();
}
}
this.repaint();
}
另一个选项是,如果任务当前处于运行状态,则仅执行addTime
方法:
@Override
public void addTime(double millis) {
if (state == State.RUNNING) {
currentMillis += millis;
if (currentMillis >= millisMax) {
stopTask();
currentMillis = millisMax;
startSubtask();
}
}
this.repaint();
}
@Override
public void addTime(double millis) {
currentMillis += millis;
if (currentMillis >= millisMax) {
stopTask();
currentMillis = millisMax;
// Only start the subtask if it is new or has been reset
if (subtask.state == State.UNDEF) {
startSubtask();
}
}
this.repaint();
}
@Override
public void addTime(double millis) {
if (state == State.RUNNING) {
currentMillis += millis;
if (currentMillis >= millisMax) {
stopTask();
currentMillis = millisMax;
startSubtask();
}
}
this.repaint();
}