当前位置: 首页 > 知识库问答 >
问题:

start()不调用run()方法

淳于升
2023-03-14
    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");
    }
}

在下面的代码中编辑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");
}
}

共有1个答案

印高阳
2023-03-14

您需要告诉类播放器中的线程t它应该运行的目标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.");
    }
}

在当前代码中,您将线程T初始化为New Thread(),但是您没有提供任何Runnabletarget,因此线程.start()方法什么也不做。

 类似资料:
  • 这是另一个非常经典的 java 多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来! new 一个 Thread,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 r

  • 本文向大家介绍Java线程的start方法回调run方法的操作技巧,包括了Java线程的start方法回调run方法的操作技巧的使用技巧和注意事项,需要的朋友参考一下 面试中可能会被问到为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法? Java 创建线程的方法 实际上,创建线程最重要的是提供线程函数(回调函数),该函数作为新创建线程的入口函数,实现自己

  • 问题内容: 根据Java Doc 该接口定义了一个单一方法,旨在包含在线程中执行的代码。将Runnable对象传递给Thread构造函数。 因此, 当我们执行HelloRunnable时,谁调用了内部run方法? 在类中,方法如下所示: 从这段代码中,我们可以看到start方法没有调用该方法。 问题答案: 在以下文档中正确声明: Java虚拟机调用此线程的方法 因此,正是JVM中的本机代码负责调用

  • 我已经尝试了这个平台上提供的所有答案,但没有成功。我正在执行这个命令行运行程序,但是run方法没有调用。 我感谢你的帮助。 谢谢 我尝试了以下解决方案,但得到了这个例外。 第一:在您的引导类(具有SpringApplication.run(…,args)的主方法的类)中,您可以在@SpringBootApplication注释处添加属性scanBasePackages: @SpringBootAp

  • 问题内容: 请解释以下代码的输出: 如果我致电,输出为: 如果我致电,输出为: 为什么会有这种不一致?请解释。 问题答案: 该方法启动一个新线程,该线程的入口点就是方法。如果直接调用run(),它将在同一线程中执行。假设调用将启动一个新的执行线程,则该方法可在其余主方法执行之后(如您的示例)被调用。 将您的main方法更改为调用并重复运行,您会发现有时它会输出: 有时它输出: 取决于Java选择如

  • 本文向大家介绍Java线程中start和run方法全面解析,包括了Java线程中start和run方法全面解析的使用技巧和注意事项,需要的朋友参考一下 自定义线程两种方法 自定义一个runnable接口的实现类,然后构造一个thread,即对thread传入一个runnable接口类。 new一个thread或者写个thread子类,覆盖它的run方法。(new 一个thread并覆盖run方法实