start()不调用run()方法
我正在尝试运行以下 java 程序。但它没有显示任何输出。
class Player implements Runnable{
Thread t = new Thread();
public Player(String name) {
t.setName(name);
t.start();
}
@Override
public void run() {
System.out.println(t.getName() + "starts the race.");
for(int i = 0; i<3; i++)
{
System.out.println(t.getName() + " crossed " + i + " obstacle.");
}
System.out.println(t.getName() + " finishes the race.");
}
}
class Competition {
public static void main(String[] args){
Player player1 = new Player("Cercei");
Player player2 = new Player("Jamie");
Player player3 = new Player("Tyrion");
}
}
我受到了两个限制。
1. 请勿编辑竞赛类。
2. 不允许在 Player 类中添加任何变量。只添加必要的方法。
输出可能是这样的:
杰米开始比赛。Cercei 开始比赛。提利昂开始比赛。Cercei 越过 0 障碍。杰米越过 0 个障碍。提利昂越过 0 个障碍。杰米越过 1 个障碍物。杰米越过 2 个障碍物。Cercei 越过 1 个障碍物。Cercei 越过 2 个障碍物。Cercei 完成比赛。提利昂越过 1 个障碍物。提利昂越过 2 个障碍。提利昂完成比赛。杰米完成了比赛。
我已经编写了整个代码,因为我在互联网上阅读了有关线程操作的信息,但没有任何输出。此外,我已经检查了调试器。在t.strat()方法之后,它永远不会进入run() method. 你能帮忙吗?
原问题:
在以下代码中编辑 Player 类,以便代码提供预期的输出。不要只打印预期的输出。不要编辑竞赛类。不允许在 Player 类中添加任何变量。只添加必要的方法。您的代码会给出与预期输出完全相同的输出吗?解释原因。
class Player implements Runnable{
Thread t;
}
class Competition{
public static void main(String[] args){
Player player1 = new Player("Cercei");
Player player2 = new Player("Jamie");
Player player3 = new Player("Tyrion");
}
}
回答
你需要告诉Thread t你的班级内部它应该运行Player的目标是什么Runnable。
鉴于您的设计,目标Runnable是Player类本身 ( this):
class Player implements Runnable {
Thread t;
public Player(String name) {
t = new Thread(this); //<-- the target Runnable of the Thread t is the instance of Player itself
t.setName(name);
t.start();
}
@Override
public void run() {
System.out.println(t.getName() + "starts the race.");
for (int i = 0; i < 3; i++) {
System.out.println(t.getName() + " crossed " + i + " obstacle.");
}
System.out.println(t.getName() + " finishes the race.");
}
}
在您当前的代码中,您初始化Thread tasnew Thread()但没有提供任何Runnable目标,因此.start()线程的方法根本不执行任何操作。
Ps 我非常同意 Andy Turner 的评论(尽管我猜你这样做只是为了练习目的):在构造函数中启动线程确实不是一个好习惯。