2

私の状況では、2 つの同時スレッドがあり、1 つはタイマーを開始できず、もう 1 つはタイマーを停止できます。タイマーは、開始すると 5 秒までカウントし、その後関数を実行するように動作します。タイマーが他のスレッドによって停止されるまで、これを続けます。これをJavaでどのように実装できますか。これは私が持っているものです、私はそれが間違ったやり方だと感じています:

sleep は、他の 2 つのスレッドがオンとオフを切り替えるグローバルな揮発性変数であることに注意してください。

            void creatTime(final EventHandler handler)
            {
                Thread timer = new Thread()
                {
                    public void run()
                    {
                        try
                        {
                            while(true)
                            {
                                while(sleep) Thread.sleep(1000);

                                //invoke function

                            }
                        }
                        catch(IOException e)
                        {
                            System.out.println(e);
                        }
                    }
                };
                timer.start();
            }
            }
4

2 に答える 2

4

を作成し、TimerTask5 秒ごとに実行するようにスケジュールできます

TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                //Invoke your function here
            }
        };

// タイマーを作成してスケジュールする

Timer timer = new Timer();

timer.scheduleAtFixedRate(timerTask, 0, 5*1000);

//Timer を終了するには、そのcancelメソッドを呼び出します。

于 2012-11-06T06:56:19.693 に答える
2

TimerTask の推奨事項に同意します。一般に、スレッド関連の作業を java.util.concurrent などのより高いレベルの機能に渡すことができるほど、より良い結果が得られます。たとえば、元のコードはスリープからの早期復帰を処理しません。

さらに、スリープ変数が再設計後に残っている場合は、揮発性としてマークするか、同期された get および set メソッドを介してアクセスする必要があります。あるスレッドで実行された書き込みが、別のスレッドで実行された読み取りから見えるようにならなければならないことを保証する限定された一連のアクティビティがあります。

于 2012-11-06T13:43:50.263 に答える