2016-08-07 17 views
0

私はタイマーを開始し、毎秒コードを繰り返して停止します。何が起こるのは、メインからの実行を止めないということです。私はそれがそれと一緒に実行されている唯一のスレッドだと仮定していますが、私はまだ一時停止する方法を確認していない投稿を見てから。ドキュメントによって述べたようTimerTaskは他のすべての実行を中止します

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(); 
    } 
} 
+0

あなたの質問が何であるかはっきりしません。何を停止したいのですか? – rodit

+1

タイマーは、呼び出しコードの実行を停止することは想定されていません。これは、それを使用する主な理由の1つです。 –

+0

なぜ私は答えを見つけられなかったのでしょうか...代替案は何ですか? @Roditドアタイマーの5秒間が経過するまで他のすべてを止めようとしていますが、パスワードを尋ねるメイン関数の実行である完全なオートクローズ –

答えて

1

、タイマーは次のとおり

A facility for threads to schedule tasks for future execution in a **background thread** 

これはTimerTaskをを用いたプログラムの実行のいずれかの部分が主なものとは別のスレッドで実行し、したがってしないであろうことを意味メインスレッドでのブロック実行

void timer(int seconds)throws InterruptedException{ 
    for(int i = 0; i < seconds; i++){ 
     Thread.sleep(1000); 
     //Output whatever message you want to appear every second. The variable 'i' will hold the current second in the countdown. 
    } 
} 

そして、あなたのオートクローズメソッドを置き換えます。

代替ソリューションは、以下のように(。これであなたのタイマー()メソッドを交換し、InterruptedExceptionあるをキャッチ)秒の所望の量のためのスレッドをスリープ状態になりますこれで:

public void autoClose(){ 
    System.out.print("Door closing in 5 seconds . . ."); 

    //right before it starts the timer and task 
    timer(5); 

    //then resume here after the timer completes 
    activate(); 
} 

Thread#sleepInterruptedExceptionをスローするので、これは適切に処理しなければなりません。

+0

タイマーを開始するremote.toggleDoorの後にこれをメインに置いたように見えるが、それでも出力は「ドアが閉じている」ことを妨げない。 –

+0

申し訳ありませんが、私はあなたがこれをどこに置くべきか誤解していると思います。私は2番目の@DannyPでもっと明確にします。 – rodit

+0

わかりました。私が書いたタイマーの代わりになります –

関連する問題