1

知っておく必要がある人のために、私は Minecraft の改造バージョンである CraftBukkit のプラグインを書いています。私は初心者レベルの Java プログラマーです。本当に基本的な質問だと思います。

毎秒 20 秒間プレイヤーにメッセージを送信するメソッドを実行するカウントダウンを実装しようとしています。

明らかに、単純に 20 秒間ループするループを作成することはできません。ループが終了するまでメイン スレッドがフリーズするためです。これは受け入れられません。(実行中のゲームコードがたくさんあります)

受動的に、またはメイン スレッドを停止せずに実行されるループを作成するには、どのような方法がありますか?

私が考えられる唯一のことは、カウントダウンを実行するための新しいスレッドを作成することです.確かにこれを行う簡単な方法はありますか?

混乱しないように、カウントダウンはメイン ループの一部として初期化されず、ユーザー コマンド リスナーによって線形に初期化されますが、そのコードはメイン ループで実行されます。つまり、このコードは 1 回しか実行されないため、時間をチェックするループを実際に開始する必要があるということです。

私が明確でなかったり、意味をなしていなかったりしたら、申し訳ありません。

4

3 に答える 3

1

を使用してjava.util.concurrent.Executors.newSingleThreadScheduledExecutor()、1 秒間隔でカウントダウン タスクを便利にスケジュールします。

または、タスクをイベント ディスパッチ スレッド (「GUI スレッド」) で実行する必要がある場合は、javax.swing.Timer.

于 2013-05-08T16:33:33.490 に答える
1

GUI/グラフィックスに Swing を使用していない場合はお勧めしjava.util.Timerます (CraftBukkit に慣れていないため、判断するのはあなた次第です)。schedule特に、タスクを一定の間隔で繰り返すことができるフォームに注目してください。

javax.swing.Timer似ている。最大の違い (トリガーされたタイマーに応答するために使用されるインターフェイスを除く) はjavax.swing.Timer、EDT (イベント ディスパッチ スレッド) を使用してイベントを実行することです。Swing GUI を使用している場合、このスレッドはすでに存在し、実行されており、それを使用したいと考えています。Swing または AWT を使用していない場合、これは必要のない余分なオーバーヘッドです。

于 2013-05-08T16:51:06.680 に答える
0

試しましたjavax.swing.Timerか?

  int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //...Perform a task...
      }
  };
  new Timer(delay, taskPerformer).start();
于 2013-05-08T16:35:57.220 に答える