2016-04-09 25 views
-2

私は2つの入れ子になったwhileループを持っています。内側のループを止めれば、内側が動いているかどうかを調べます。私は、タイマーを開始し、停止するメソッドがありますが、私はタイマーを停止し、それを再起動する(真にブール値を設定する)タイマーを開始しないでください。 innerが一時停止している間にSystem.out.println( "test")のような外部ループでいくつかの操作を実行すると、正常に動作します。ここwhileループが動作しないのはなぜですか?

@Override 
protected synchronized Void call() throws Exception { 
    while(true){ 
     System.out.println(); 
     while(play){ 
      System.out.println(play); 
      secondCounter++; 
      seconds++; 
      if(seconds>59){ 
       secondCounter=0; 
       seconds=0; 
       minutes++; 
      } 
      if(minutes>59){ 
       minutes=0; 
       hours++; 
      } 
      System.out.println("Task sekunden: "+seconds); 
      setTime(); 
      Thread.sleep(1000); 
     } 
    } 
} 

は完全なクラスである:

public class TimerTask extends Task<Void>{ 

private Label timer; 
private boolean play=false; 

private int secondCounter; 

private int seconds; 
private int minutes; 
private int hours; 

public TimerTask(Label timer){ 
    this.timer=timer; 
} 

@Override 
protected synchronized Void call() throws Exception { 
    while(true){ 
     while(play){ 
      System.out.println(play); 
      secondCounter++; 
      seconds++; 
      if(seconds>59){ 
       secondCounter=0; 
       seconds=0; 
       minutes++; 
      } 
      if(minutes>59){ 
       minutes=0; 
       hours++; 
      } 
      System.out.println("Task sekunden: "+seconds); 
      setTime(); 
      Thread.sleep(1000); 
     } 
    } 
} 

public int getMinutes(){ 
    int time; 
    time=minutes + (hours*60); 
    if(seconds>30){ 
     time++; 
    } 
    return time; 
} 

public void test(){ 
    String secondsTime; 
    String minutesTime; 
    String hoursTime; 

    if(seconds<10){ 
     secondsTime="0"+seconds; 
    }else{ 
     secondsTime=String.valueOf(seconds); 
    } 
    if(minutes<10){ 
     minutesTime="0"+minutes; 
    }else{ 
     minutesTime=String.valueOf(minutes); 
    } 
    if(hours<10){ 
     hoursTime="0"+hours; 
    }else{ 
     hoursTime=String.valueOf(hours); 
    } 

    System.out.println(hoursTime+":"+minutesTime+":"+secondsTime); 
} 

public void setTime(){ 
    String secondsTime; 
    String minutesTime; 
    String hoursTime; 

    if(seconds<10){ 
     secondsTime="0"+seconds; 
    }else{ 
     secondsTime=String.valueOf(seconds); 
    } 
    if(minutes<10){ 
     minutesTime="0"+minutes; 
    }else{ 
     minutesTime=String.valueOf(minutes); 
    } 
    if(hours<10){ 
     hoursTime="0"+hours; 
    }else{ 
     hoursTime=String.valueOf(hours); 
    } 
    Platform.runLater(() -> {timer.setText(hoursTime+":"+minutesTime+":"+secondsTime);}); 
} 

public void stop(){ 
    this.play=false; 
    System.out.println("Stop: "+play); 
} 

public void start(){ 
    this.play=true; 
    System.out.println("Start: "+play); 
} 

public void reset(){ 
    this.play=false; 
    secondCounter=0; 
    seconds=0; 
    minutes=0; 
    hours=0; 
    timer.setText("00:00:00"); 
    System.out.println("Reset: "+play); 
} 

}

+0

「再生」とは何ですか、どのように設定していますか? – user2004685

+0

あなたの質問は非常に不明です。コードを表示し、得られる出力と期待している出力を表示します。 '遊び 'とは何ですか?どのように定義されていますか?あなたは本当に、再生が間違っているときに出力に新しい行を書き込むビジーなループを本当にしたいですか? –

+0

playはブール値で、パブリックセッターとゲッターメソッドで設定します。 – Steinliiippp

答えて

0

play読み、いくつかのスレッドから変更が、揮発性ではありません。したがって、あなたはその可視性について保証されません。 1つのスレッドはそれをtrueに設定し、別のスレッドはそれを永遠にfalseと見なします。

コードの残りの部分もスレッドセーフではありません。すべての共有状態は、いかなる種類の同期もなしにアクセスされる。

あなたは本当にそのコード内の何かに頼ることはできません。

+0

私はちょうど揮発性にブール値の再生を設定し、それは動作します...ありがとう。私は同期して試しましたが、これはGUI全体をハングさせます。なぜ私に説明できますか? – Steinliiippp

+0

このトピックでは、説明するための本を取り上げます。 「Java Concurrency in Practice」のコピーを購入し、それを読んでください。 Javaでマルチスレッドを真剣に考えたければ、読んでおく必要があります。 –

関連する問題