

タイムアウトの実装をしたくてTimerクラスのscheduleメソッドを使い,

[code]

       to.schedule( time,1000 );
    
[/code]

のようにして1000ms後にtimeオブジェクトの処理を実行させています.

[code]

    class TimeOut extends TimerTask {
        private boolean isStop = false;
        public void run(){
            isStop = true;
        }
        public boolean getStop(){
            return isStop;
        }
    }
    
[/code]

一方でこのtimeオブジェクトの実行内容はTimerTaskを継承したTimeOutクラス内のrun()メソッドで定義されています.  
これはisStop変数の中身をtrueにするだけのもので,のちに

[code]

    if(time.getStop()==true){
          /*処理*/
    }
    
[/code]

のようにしてisStop変数を参照してタイムアウトされたかを判断したいと思っています.  
しかしどうも1000ms後にtimeオブジェクトのrun()が実行されるとオブジェクトの中身が破棄されてしまっているようで後からisStopが参照できないようです.  
こういう場合どうすればいいのでしょうか.


CC BY-SA 3.0
2016-02-04T14:46:19.523
21711
2016-06-10T17:01:38.490
13260
question
java
javaのTimerクラスのscheduleメソッドについて


`TimeOut`クラスの`run`メソッドが呼ばれていますか？  
`Timer`を使う場合、通常であれば下記のように処理を呼び出すと思います。

[code]

    final TimeOut timeOut = new TimeOut();
    final Timer timer = new Timer();
    
    System.out.println(timeOut.getStop());
    
    timer.schedule(timeOut, 1000);
    // 10秒間処理を待つ
    TimeUnit.SECONDS.sleep(10);
    timer.cancel();
    
    System.out.println(timeOut.getStop());
    
[/code]

このとき、1000ms後の処理を待たずに`Timer`クラスの`cancel`メソッドを呼び出してしまうと`TimeOut`クラスの`run`メソッドは呼び出されません。

ちなみに上記の簡易なコードであれば最初の出力は`false`、最後の出力は`true`になります。


CC BY-SA 3.0
2016-02-05T00:03:56.357
21722
2016-02-05T00:03:56.357
10724
21711
answer