Java 线程对另一个线程有影响?

Java 线程对另一个线程有影响?,java,multithreading,Java,Multithreading,因此,我想制作一个任务列表,每个任务都有一个内置计时器,用于培训目的。我的想法是,我可以启动一个顶级任务,在该任务的计时器完成后,如果子任务已附加到顶级任务,则将启动一个子任务。我使用JavaSwing提供了一个可以启动任务的GUI。每个任务都应该创建自己的myTimer类实例,用于测量任务的持续时间。TaskObject类通过startTask()启动计时器 问题是: 当我附加子任务时,子任务将启动,但其计时器在完成后不会停止。它到达while循环的末尾,但不知何故它不断地进入和离开循环,我不

因此,我想制作一个任务列表,每个任务都有一个内置计时器,用于培训目的。我的想法是,我可以启动一个顶级任务,在该任务的计时器完成后,如果子任务已附加到顶级任务,则将启动一个子任务。我使用JavaSwing提供了一个可以启动任务的GUI。每个任务都应该创建自己的my
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();
}