Я пытаюсь реализовать секундомер, аналогичный тому, который можно найти по адресу Есть ли секундомер? в 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
while( ( this.runningTime = System.currentTimeMillis() ) < this.endTime) {
... он не компилируется без закрывающих круглых скобок из-за проблем с приоритетом операций с<
. 09.11.2013this.runningTime = (System.currentTimeMillis() < this.endTime);
. Хороший улов в скобках. 09.11.2013