Ich habe ein Programm, das einen Timer startet und dann Code jede Sekunde wiederholt, bevor es stoppt. Was passiert, ist, dass es die Ausführung von main nicht stoppt. Ich gehe davon aus, dass es nur ein Thread ist, der damit einhergeht, aber wenn ich mir die Posts anschaue, bin ich mir immer noch nicht sicher, wie ich das vorübergehend stoppen kann.TimerTask stoppe alle anderen Ausführungen
final class DogDoor{
private static DogDoor dogDoor;
private boolean open;
private DogDoor(){
open=false;
}
public static synchronized DogDoor getDogDoor(){
if(dogDoor==null){
dogDoor=new DogDoor();
}
return dogDoor;
}
public void activate(){
open=!open;
System.out.println(open? "Door is open!": "Door is closed!");
if(open){
autoClose();
}
}
public void autoClose(){
System.out.print("Door closing in 5 seconds . . .");
//right before it starts the timer and task
timer();
//then resume here after the timer completes
activate();
}
public void timer(){
new java.util.Timer().scheduleAtFixedRate(
new java.util.TimerTask(){
//Prefer to stop until this completes
int s=5;
@Override
public void run(){
System.out.print(" .");
if((s--)==0){
cancel();
}
}
}, 0, 1000);
}
}
final class Remote{
private static Remote remote;
private boolean windowsLocked;
private int lockCode;
public Remote(){
windowsLocked=true;
generateLockCode();
}
public static synchronized Remote getRemote(){
if(remote==null){
remote=new Remote();
}
return remote;
}
public String getLockCode(){
return String.format("%03d", lockCode);
}
public boolean windowsLocked(){
return windowsLocked;
}
public void generateLockCode(){
lockCode=(int)(Math.random()*1000);
}
public void toggleDoor(){
DogDoor.getDogDoor().activate();
}
public void fixWindows(){
if(passCodeVerifier()){
windowsLocked=!windowsLocked;
System.out.println(windowsLocked? "Windows locked!": "Windows unlocked!");
}
else{
System.out.println("Invalid passcode!");
}
}
public boolean passCodeVerifier(){
Scanner scanner=new Scanner(System.in);
System.out.print("Enter three digit keypad code: ");
return scanner.hasNext("^\\d{3}$") && Integer.parseInt(scanner.next())==(lockCode);
}
}
public class DogDoorDemo{
public static void main(String[] args){
System.out.println("Dog door demo.");
System.out.println();
System.out.println(Remote.getRemote().getLockCode());
Remote.getRemote().toggleDoor();
//and finally resume here
Remote.getRemote().fixWindows();
}
}
Es ist nicht ganz klar, was Ihre Frage ist. Was möchten Sie anhalten und wann? – rodit
Ein Timer soll die Ausführung des aufrufenden Codes nicht stoppen - das ist einer der Hauptgründe für seine Verwendung. –
Vielleicht warum ich keine Antwort gefunden habe ... was ist eine Alternative? @Rodit Ich versuche, alles andere zu stoppen, bis die 5 Sekunden Dauer auf der Tür-Timer, und autoclose, die Hauptfunktion Ausführung, die für das Passwort –