我如何制作一个对象的多个线程?
我有一个带有构造函数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)的值相对应的信息列表,并一次更新一个。有什么建议吗?
答案 0 :(得分:3)
除非Character
是Thread
的子类,否则您无法将Character
个对象放入Thread[]
。对于所有对象都是如此 - 您不能将一种类型的对象(例如,B
)视为另一种类型(例如,B
),除非B extends A
。< / p>
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!
}
}
VS
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
}
}
就个人而言,这听起来并不像你真的需要线程。你知道what the Thread
class is for吗?为什么不直接使用你的对象实际的数组呢?还有其他一些事情:我重命名Character
,因为那已经是标准库中的一个类了。如果您尝试命名char
,您也会收到编译错误,因为该标识符是为char
基元类型保留的。
Player[] players = new Player[numberOfPlayers];
答案 1 :(得分: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();
}
注意:此代码绝对不完整。我只想暗示如何做到这一点。
除非你准备好进行很多非常艰难的编程,否则你最好跳过“激活”方法,将run方法直接放在Player中,然后让你的玩家按照这样的循环移动:
while (true) {
for (Player p : parry) p.run();
// Do non-player stuff here.
}
现在你只有一个帖子。更少会出错,当它发生时,你将能够追踪它。 (而且我还在提供一些提示。将无限循环与UI集成在一起并不是一件小事。)
答案 2 :(得分:0)
您不能使用char
作为标识符,因为它是保留字。只需将您的数组名称更改为chars
我们的内容。
你的Character类也必须扩展Thread才能将它放在一个Thread数组中。