有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java解释多线程的输出

这个程序的输出是“内线程内线程”,这是怎么发生的

class MyThread extends Thread 
{ 
    MyThread() {} 
    MyThread(Runnable r) {super(r); } 
    public void run() 
    { 
        System.out.print("Inside Thread ");
    } 
} 
class MyRunnable implements Runnable 
{ 
    public void run() 
    { 
        System.out.print(" Inside Runnable"); 
    } 
} 
class ThreadRunnableBoth 
{  
    public static void main(String[] args) 
    { 
        new MyThread().start();
        new MyThread(new MyRunnable()).start(); 
    } 
}

我可以理解第一个“内部线程”是如何打印的,但第二次打印我希望打印“内部可运行”,但它打印“内部线程”,这是如何发生的? 请解释。。。。。非常感谢


共 (5) 个答案

  1. # 1 楼答案

    MyThread类中,您正在重写run()方法。这意味着,即使您将Runnable传递到构造函数中,也只会调用您的run方法,并且Runnable目标将被忽略

    下面是您要覆盖的Thread.run()方法代码:

    public void run() {
        if (target != null) {
            target.run();
        }
    }
    

    如果您想使用runnable,我会:

    new Thread(new MyRunnable()).start();
    

    不使用MyThread类的

  2. # 2 楼答案

    Thread中的run方法定义如下:

    public void run() {
      if (target != null) {
        target.run();
      }
    }
    

    因为您在MyThread中重写了run,所以它实际上不会调用您的MyRunnable

    要获得您期望的行为:

    new MyThread().start();
    new Thread(new MyRunnable()).start(); 
    
  3. # 3 楼答案

    将第二个调用更改为线程:

    new Thread(new MyRunnable()).start
    

    因为您的自定义线程重写了run方法,即使在您将runnable传递给线程构造函数之后,该方法也将被调用

  4. # 4 楼答案

    java.lang.Threadrun()方法只调用target.run(),其中target是构造期间提供的Runnable。然而,在MyThread中,您已经覆盖了这个功能;您的版本run()忽略目标,而是打印“内部线程”

    修复此问题的一种方法是使用基类Thread的实例运行Runnable

    new Thread(new MyRunnable()).start();
    

    其他可能是而不是重写run(),或者从重写中调用super.run()

  5. # 5 楼答案

    new MyThread().start();
    

    在本例中,通过MyThread(){}构造函数调用MyThread类的run()方法创建线程

    在第二种情况下,通过MyThread(Runnable)构造函数调用相同MyThread类的run()方法创建线程