Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我从这个java程序中得到以下输出?_Java_Multithreading - Fatal编程技术网

为什么我从这个java程序中得到以下输出?

为什么我从这个java程序中得到以下输出?,java,multithreading,Java,Multithreading,您好,我是java新手,目前正在学习多线程,当我运行上述程序时,我会得到这个特定的输出MyThread foo请解释原因?MyThread来自构造函数 foo来自run方法,该方法在调用start()时被调用 本质上,run()方法(打印baz)在main中被覆盖 而run(String s)是一个重载方法,在这里没有意义。它执行MyThread构造函数,然后执行run()方法 Thread t=new MyThread(),您试图创建一个MyThread对象,因此它执行构造函数 class M

您好,我是java新手,目前正在学习多线程,当我运行上述程序时,我会得到这个特定的输出MyThread foo请解释原因?

MyThread来自构造函数

foo来自
run
方法,该方法在调用
start()
时被调用

本质上,
run()
方法(打印baz)在
main
中被覆盖


run(String s)
是一个重载方法,在这里没有意义。

它执行
MyThread
构造函数,然后执行
run()
方法

Thread t=new MyThread()
,您试图创建一个
MyThread
对象,因此它执行构造函数

class MyThread extends Thread 
{
    MyThread() 
    {
        System.out.print(" MyThread");
    }
    public void run() 
    {
        System.out.print(" bar");
    }
    public void run(String s) 
    {
        System.out.println(" baz");
    }
}
public class TestThreads 
{
    public static void main (String [] args) 
    {
        Thread t = new MyThread() 
        {
            public void run() 
            {
                System.out.println(" foo");
            }
        };
        t.start();
    }
}
然后启动线程
t.start()
,它执行您在
main(String[]args)
中重写的
run()
方法:


首先创建
MyThread
的实例,该实例调用构造函数并打印“MyThread”。然后,调用
t.start()
调用
run
方法

即使您定义了打印“bar”的
run
方法,它也会被
main
方法(打印“foo”)中的方法覆盖

请尝试以下操作:

public void run() 
{
     System.out.println(" foo");
}

看看会发生什么

原因是,首先调用create对象时,构造函数
MyThread
并打印字符串的第一部分。启动线程时,继续执行run方法并打印MyThread默认构造函数中的第一个输出,它将覆盖
run()
方法:

Thread t = new MyThread();
t.start();
输出:

线程foo

输出:

神话读物 酒吧


请注意,第一个方法重写了
run()
方法,并在其中使用了自定义消息,但第二个方法将在MyThread类中默认重写
run()

在创建
线程t
时重写
run
方法。这个新的实现打印“foo”,它比您在MyThread类中实现的优先,MyThread类仍然运行它自己的打印“MyThread”的构造函数。

您不期望的呢?
Thread t = new MyThread();
t.start();
Thread t = new MyThread() 
        {
            public void run() 
            {
                System.out.println(" foo");
            }
        };
Thread t = new MyThread() ;