Timer mit Thread in Java?
Ich habe 2 Klassen in der einen ist eine Methode die etwas ausgibt und in der anderen eine run methode die einen sleep beinhaltet. Ich möchte jetzt aber, dass die output methode dauerhaft überprüft ob der Thread gestopt hat oder das die Methode abgebrochen wird wenn der Thread gestopt wird (eine while thread.isAlive geht auch nicht weil es dann mehrmals ausgegeben wird). Könnte mir jemand helfen?
run klasse:
public class ThreadTimer extends Thread{
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
stop();
}
}
Output methode:
public void outPutQuestion() {
if (thread.isAlive()) {
gameStart = true;
Console.getInstance().append(questionArraylist.get(numberQuestionField).getQuestion() + "\t\t");
Console.getInstance().appendLine("Time: " + questionArraylist.get(numberQuestionField).getTime() + "sec");
for (String s : questionArraylist.get(numberQuestionField).getAnswer()) {
Console.getInstance().append(" | " + s + " | ");
}
Console.getInstance().appendLine(" ");
}
}
1 Antwort
Was ist hier die Zielsetzung?
Erstens hat Java eingebaute Timer. Dein so mühsam gebauter Thread ist daher unnötig (und bitte nicht stop() verwenden, es ist weder nötig noch sinnvoll - eigentlich solltest du dafür Compilerwarnungen bekommen).
Zweitens kannst du eine Methode nicht einfach von außen "abbrechen". Was du allenfalls machen kannst ist mit Interruption arbeiten, sofern die blockierenden Methoden darauf reagieren. Das ist die komische Exception, die du in deinem Thread sinnloserweise mit e.printStackTrace() behandelst...
Wenn du einfach prüfen willst ob eine gewisse Zeitspanne abgelaufen ist, merkst du dir am Anfang der Methode die aktuelle Zeit und vergleichst in einer Bedingung, ob sie überschritten wurde. Etwa so:
final var endTime = System.currentTimeMillis() + 10_000; // 10 s
while(System.currentTimeMillis() < endTime) {
// tu was, solange die Zeit nicht abgelaufen ist
}