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));
    }

但得到一个“类型不匹配错误:无法从播放器转换为线程”。

我基本上想在一个循环中创建这些线程,因为每次程序运行时,都会有随机数量的玩家。线程将需要访问与赋予每个字符(String、int、int)的值相对应的信息列表,并一次更新它们。有什么建议么?

4

3 回答 3

3

除非Character是 的子类,否则Thread不能将Character对象放入Thread[]. 这对所有对象都是正确的B——B除非B 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,因为它已经是标准库中的一个类。如果您尝试命名 something 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();

其中激活看起来像:

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 中,并让你的 Players 像这样循环移动:

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

现在你只有一个线程。很少会出错,当它出错时,您将能够追踪它。(而且我仍然只是给出提示。将无限循环与 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 回答