1

オブジェクトの複数のスレッドを作成するにはどうすればよいですか?

私はコンストラクタを持つクラスを持っていPlayer(String, int, int)ます。さて、私のメインでは、複数のPlayerオブジェクトを作成してスレッドとして使用したいと考えています。

これらのオブジェクトの配列を作成してみました

Thread[] player= new Thread[numberOfPlayers];
    for (int i = 0; i < numberOfPlayers; i++)
    {
       player[i] = new Player("Default", 0, (i + 1));
    }

しかし、「型の不一致エラー: Player から Thread に変換できません」というメッセージが表示されます。

プログラムが実行されるたびにランダムな数のプレーヤーが存在するため、基本的にこれらのスレッドをループで作成したいと考えています。スレッドは、各文字 (String、int、int) に与えられた値に対応する情報のリストにアクセスし、一度に 1 つずつ更新する必要があります。助言がありますか?

4

3 に答える 3

3

Characterが のサブクラスでない限り、オブジェクトを にThread入れることはできません。これはすべてのオブジェクトに当てはまります。あるタイプ (たとえば) のオブジェクトを別のタイプ ( など) であるかのように扱うことはできません。CharacterThread[]BBB extends A

class A {
    // Empty base class
}

public class B {
    public static void main(String[] args) {
        B b = new B();
        A[] arrayOfAs= new A[1];
        arrayOfAs[0] = b; // Compile-time error! b is not an A object!
    }
}

対。

public class B extends A { // B is now a subclass of A
    public static void main(String[] args) {
        B b = new B();
        A[] arrayOfAs= new A[1];
        arrayOfAs[0] = b; // Works just fine now
    }
}

個人的には、実際にスレッドが必要なようには思えません。クラスの目的を知っていますThread?オブジェクトが実際に何であるかから配列を作成しないのはなぜですか? 他にもいくつかあります。名前を変更します。これCharacterは、既に標準ライブラリのクラスであるためです。何かに名前を付けようとするとchar、その識別子がcharプリミティブ型用に予約されているため、コンパイル エラーも発生します。

Player[] players = new Player[numberOfPlayers];
于 2013-07-11T17:08:58.680 に答える
1

あなたがやろうとしていることは次のようなものだと思います:

Playerクラス インスタンスのセットを作成します。Player クラスにはactivate、ループを開始するメソッドがあります。そのループにより、プレーヤーは移動して他のことを行い、その後スリープしてから、無限に繰り返します。何かのようなもの:

Player[] parray = new Player[nop];
for (int i = 0; i < nop; i++)  parray[i] = new Player( ... );
for (Player p : parray)  p.activate();

activate は次のようになります。

public void activate()  {
    new Thread( new Runnable()  {
        public void run()  {
            while (true)  {
                Player.this.x += xshift;
                Player.this.y += yshift;
                // Do other things.
                Thread.sleep( 500 );
            }
        }
    } ).start();
}

注: このコードはどうしようもなく不完全です。私はそれがどのように行われるかを示唆しようとしているだけです。

非常に難しいプログラミングの準備ができていない限り、「activate」メソッドをスキップして、run メソッドを Player に直接配置し、Player を次のようなループで動かした方がよいでしょう。

while (true)  {
for (Player p : parry)  p.run();
// Do non-player stuff here.
} 

これで、スレッドは 1 つだけになりました。失敗することはほとんどなくなり、失敗したときに追跡することができます。(そして、私はまだヒントを提供しているだけです。その無限ループを UI に統合するのは簡単なことではありません。)

于 2013-07-11T18:03:54.050 に答える
0

char予約語のため、識別子としては使用できません。配列名をchars何かに変更するだけです。

また、Character クラスは、Thread 配列に入れるために Thread を拡張する必要があります。

http://en.m.wikipedia.org/wiki/List_of_Java_keywordsも参照してください。

于 2013-07-11T17:19:39.967 に答える