我正在尝试实现类似于在 Java 中有秒表吗?, 但作为Thread
.
我的SecondsCounter
类实现Runnable
,然后调用它的start
方法将创建一个线程作为局部变量。
似乎该线程与run
方法中的第一行冲突: this.runningTime = System.currentTimeMillis();
...因为条件while (this.runningTime < this.endTime)
永远不会被破坏(无限循环)...
所以拥有一个既实现Runnable
又包含它的类是不正确Thread
的好?
这是具有主要方法的类:
public class MultithreadingTest {
public static void main(String[] args) {
int totalSeconds = 5;
SecondsPrinter printer = new SecondsPrinter(totalSeconds);
printer.startPrinting();
}
} // end of class
...秒打印机类:
public class SecondsPrinter {
// composition here:
private SecondsCounter clock;
public SecondsPrinter(int totalSeconds) {
this.clock = new SecondsCounter(totalSeconds);
}
public void startPrinting() {
this.clock.start();
while (this.clock.isRunning()) {
// this is incorrectly always printing the maximum seconds value:
System.out.println(this.clock.getCurrentSecond());
}
}
} // end of class
...和秒计数器类:
public class SecondsCounter implements Runnable {
private int totalSeconds, currentSecond;
private long startTime, runningTime, endTime;
private Thread thread;
public SecondsCounter(int totalSeconds) {
this.totalSeconds = totalSeconds;
}
public int getCurrentSecond() {
return this.currentSecond;
}
@Override
public void run() {
this.runningTime = System.currentTimeMillis();
// this is an infinite loop, but it shouldn't be:
while (this.runningTime < this.endTime) {
this.currentSecond = (int)(this.endTime - this.runningTime) / 1000;
}
// this code is never reached:
this.stop();
}
public void start() {
this.startTime = System.currentTimeMillis();
this.runningTime = this.startTime;
this.endTime = this.startTime + (this.totalSeconds * 1000);
// multithreading here:
this.thread = new Thread(this);
this.thread.start();
}
public boolean isRunning() {
return this.thread.isAlive();
}
public void stop() {
this.thread.interrupt();
this.thread = null;
}
} // end of class