0

私は、あてもなくマップを歩き回る「ボット」を作成するゲームを持っています。プレイヤーがボタンをクリックするたびに、ボットを作成する新しいスレッドが作成されます。ボタンを何度も押すと、botThread という同じスレッド名で多数のボットが作成されます。

ただし、個々のボットを停止できるように、ボットを区別できるようにしたいと考えています。setName() 関数を使用して最初のボットの名前を「Bot 1」に変更しましたが、Bot1.stop() を試してみると、スレッドが存在しないと表示されますか? (私は .stop() メソッドを使用すべきではないことを知っています)。

ただし、スレッドでエラーが発生すると、「スレッド「ボット 1」で例外が発生しました」と表示されます。したがって、それは明らかに存在します!

これが私のコードの一部です:

public class botGame{

Thread botThread;

public void newBot(){

botThread = new Thread(new Runnable(){

      public void run(){

             botThread.setName("Bot 1");
4

6 に答える 6

5

スレッド名は、コードをデバッグするための便利な識別子です。アプリケーション内の変数、オブジェクト、または識別子とはまったく関係ありません。

言い換えれば、 Callingは魔法のように を呼び出すことを許可thread.setName("foo")しませfoo.stop()

代わりに、Thread作成したオブジェクトをコレクションまたはマップに保持し、そこから取得して操作します (理想的には、前述のようにを使用しませんstop())。

たとえば、単一のbotThreadフィールドの代わりに、次のようになります。

Collection<Thread> botThreads = new ArrayList<Thread>();

スレッドを開始するときは、次のようにします。

Thread botThread = new Thread( ... );
botThread.start();
botThreads.add(botThread);

また、停止を回避するというトピックに取り組んでいるため、Threadオブジェクトを保持せずに aを保持する場合は、 という名前の(または類似の)フィールドを に設定するメソッドをBotRunnable追加できます。次に、メソッド内でそのフィールドを定期的にチェックし、そうであれば単純に戻ります。pleaseStopBotRunnablevolatile booleankeepRunningfalserunfalse

于 2013-04-16T12:18:24.613 に答える
3

スレッドをリストに入れて、必要な要素に移動して削除できるようにしてください

于 2013-04-16T12:17:29.110 に答える
1

次のようにする必要があります。

public class botGame{
  Map<String, Thread> botThreads = new Map<String, Thread>();
  public void newBot(){
  Thread botThread = new Thread(new Runnable(){
    public void run(){
      }
    };
  botThreads.put("Bot 1", botThread);
}

私は私の例をエラーについて詳しくチェックしていません。また、別の名前のスレッドを作成する方法が必要ですが、マップのアイデアを得ることができると思います。

スレッド オブジェクトを見つけるには、次のようにします。Thread thread = botThreads.get("Bot 1");

于 2013-04-16T12:25:02.190 に答える
1

私の他の答えに代わるより良い方法は、ボットに独自のスレッドを追跡させることです。

class Bot {
    Thread thread = null;
    private String name;
    volatile boolean stop = false;
    Bot(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void run() {
        thread = new Thread(new Runnable(){
            public void run(){
                while(!stop) {
                    ...
                }
            }
        };
        thread.start();
    }
    public void stop() {
        stop = true;
    }
}

そして、ボット作成コードでこれを行います:

public class botGame{
    Map<String, Bot> bots = new Map<String, Bot>();

    public void makeNewBot(String name) {
        bots.put(name, new(Bot(name)));
    }

    public void startBot(String name) {
        bots.get(name).run();  // TODO: Add check for wrong name
    }

    public void stopBot(String name) {
        bots.get(name).stop(); // TODO: Add check for wrong name
    }
}
于 2013-04-16T12:36:16.420 に答える
0

スレッド名を使用する代わりに、ステートフル クラスまたはマップを監視して、スレッドに実行許可を与えるかどうかを指定できます。

したがって、実行許可が失われると、スレッドは自然に終了します。

于 2013-04-16T12:20:43.340 に答える
-1

メソッド Thread.stop() は使用しないでください。これは、非 推奨の理由により非推奨です。スレッドでフラグを使用volatile booleanして、停止するかどうかを確認します。停止したい場合は、メインスレッドでフラグを設定します。

于 2013-04-16T12:20:47.423 に答える