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

鉴于您的设计,目标RunnablePlayer类本身 ( 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 的评论(尽管我猜你这样做只是为了练习目的):在构造函数中启动线程确实不是一个好习惯。


以上是start()不调用run()方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>