1

プレイヤーからのインプットが絶えず必要なシンプルなゲームをやろうとしています。これは、特定の期間にのみ発生する必要があります。その後送信されたものはすべて破棄されます。期間が経過すると、新しいゲームが始まります。それで:

  1. ゲームを始める
  2. すべてのプレイヤーからの入力を10秒間待ちます
  3. 10秒入力なし

  4. 勝者を計算し、いくつかのことを行います
  5. 後藤1。

タイマーとtimertaskを使用して時間を追跡し、10秒後に「オープン」から「クローズ」に変化するブール変数を使用することを考えていましたか?これについてアドバイスをください。

4

3 に答える 3

2

Timerとを使用するのではなく、エグゼキュータTimerTaskを使用する最新の方法にあなたの考えを更新します。を使用すると、次のようにスケジュールできます。ScheduledExecutorRunnable

// class member or perhaps method var
private boolean acceptInput = true;

// elsewhere in code
ScheduledExecutor executor = new ScheduledExecutor(1);
startGame();
mainLoop();
executor.schedule(flipInput, 10, TimeUnit.SECONDS);

// inner class
private class FlipInput implements Runnable {
    public void run() {
        acceptInput = !acceptInput;
        calculateWinner();
        doSomeStuff();
        startGame();
        executor.schedule(flipInput, 10, TimeUnit.SECONDS);
        mainLoop();
    }
}
于 2010-04-30T16:23:00.250 に答える
0

そうです、タイマーを使用すると、その値を変更できます。

 Timer timer = new Timer();
 timer.schedule( new TimerTask(){
       public void run() {
            synchronized( lock ) { 
                isOpen = false;
            }
        }
   }, 10000 );

以上です。内部のメソッドrunは、呼び出してから10秒後に実行されますschedule

編集

サンプル:

import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;
import static java.lang.System.out;

public class Test {
    public static void main( String [] args ) {
        Timer timer = new Timer();
        timer.schedule( new TimerTask(){
            public void run() {
                out.println(new Date()+" No more bets, thank you!");
            }
        }, 10000 );
        out.println(new Date() + " Place your bets, place your bets!!");
    }
}
于 2010-04-30T16:20:16.290 に答える
0

はい、タイマーが必要です。ある種の「開/閉」フラグがその方法になります。

入力を読み取るすべてのスレッドが一度に変更を確認できるように、フラグを「揮発性」にするようにしてください。

考えてみると、タイマータスクが各リーダースレッドに割り込みでヒットすることを考えるかもしれません。そのため、チェックするためにポップアップするたびにではなく、すべてが一度に通知されます。

于 2010-04-30T16:21:48.997 に答える