Ich habe ein TimeBomb-Objekt. Ich muss die Bombe basierend auf einer Timing-Logik explodieren lassen. Die Bombe wartet maximal 10 Sekunden und in diesem Zeitintervall, wenn niemand in diesem Intervall die Bombe auf die letzte Zeit zurücksetzt, wird sie explodieren. Ich habe eine Implementierung gefunden. Ich beginne die Wartelogik, indem ich den Timer auf die aktuelle Uhrzeit um 16:24:40 Uhr setze. Jetzt soll die Bombe um 16:24:50 explodieren. Nach dem Schlafen für 2 Sekunden setze ich die Bombe auf die aktuelle Zeit um 16.24.42 Uhr zurück. Jetzt sollte die Bombe erst um 16:24:52 explodieren, da die maximale Wartezeit 10 Sekunden beträgt. Aber die Logik, die ich implementiert habe, explodiert immer um 16:24:50. Wo mache ich mich falsch?Warte-Logik für Inaktivität
public class TestTimeBomb {
public static void main(String[] args) throws InterruptedException {
TimeBomb bomb = new TimeBomb();
long time1 = System.currentTimeMillis();
System.out.println("First setting event at time " + getHumanReadableTime(time1));
bomb.resetBomb(time1);
Job job = new Job(bomb);
new Thread(job).start();
Thread.sleep(2000);
long time2 = System.currentTimeMillis();
System.out.println("Second setting event at time " + getHumanReadableTime(time2));
bomb.resetBomb(time2);
}
public static Date getHumanReadableTime(long time) {
Timestamp stamp = new Timestamp(time);
Date date = new Date(stamp.getTime());
return date;
}
}
class Job implements Runnable {
TimeBomb bomb;
Job(TimeBomb bomb) {
this.bomb = bomb;
}
@Override
public void run() {
WaiterLogic waiterLogic = new WaiterLogic(bomb);
new Thread(waiterLogic).start();
}
}
class WaiterLogic implements Runnable {
private TimeBomb test;
WaiterLogic(TimeBomb test) {
this.test = test;
}
@Override
public void run() {
long currentTimeMillis = System.currentTimeMillis();
System.out.println("Entering while loop this job should end at " + TestTimeBomb.getHumanReadableTime(currentTimeMillis + 10000));
while (true) {
long bombTime = test.getBombTime();
long curentTime = System.currentTimeMillis();
long diffTIme = curentTime - bombTime;
if (diffTIme > 10000)
break;
}
long end = System.currentTimeMillis();
System.out.println("This job should have ended at" + TestTimeBomb.getHumanReadableTime(test.getBombTime() + 10000));
System.out.println("But ended at time " + TestTimeBomb.getHumanReadableTime(end));
System.out.println("Diff is " + (end - (test.getBombTime() + 10000)));
}
}
class TimeBomb {
private long bombTime;
public long getBombTime() {
return bombTime;
}
public void resetBomb(long bombTime) {
this.bombTime = bombTime;
}
}
Ich denke, es ist wie erwartet – Sanjeev
Beispielausgabe arbeiten: –
Erste Einstellung Ereignis zum Zeitpunkt Fr 8. April 17.29.11 IST 2016 while-Schleife Anfang dieser Job bei Fr 8. April 17.29.21 IST 2016 enden soll Zweite Einstellung Veranstaltung um Zeit Fr Apr 08 17:29:13 IST 2016 Dieser Job sollte beendet seinFri Apr 08 17:29:23 IST 2016 Aber endete um Zeit Fr Apr 08 17:29:21 IST 2016 Diff ist - 2028 –