📜  重写 Thread 类 start() 方法

📅  最后修改于: 2022-05-13 01:55:10.256000             🧑  作者: Mango

重写 Thread 类 start() 方法

每当我们重写 start() 方法时,我们的 start() 方法就会像正常的方法调用一样被执行,并且不会创建新线程。我们可以覆盖 Thread 类的 start/run 方法,因为它不是最终的。但不建议重写 start() 方法,否则会破坏多线程概念。

// Java program illustrate the concept of
// overriding of start() method
class Bishal extends Thread {
public void start()
    {
        System.out.println("Start Method");
    }
public void run()
    {
        System.out.println("Run Method");
    }
} class Geeks {
public static void main(String[] args)
    {
        Bishal thread = new Bishal();
        thread.start();
        System.out.println("Main Method");
    }
}

输出:

Start Method
Main Method

注意:在上面的程序中,当我们通过 Bishal 类的对象调用 start() 方法时,不会创建任何线程,所有功能都由主线程完成。

JVM为上述程序提供的运行时栈:

当我们在线程上调用 start() 方法时,它会在内部调用新创建的线程的 run() 方法。因此,如果我们重写 start() 方法,在我们编写调用 run() 方法的代码之前,不会调用 run() 方法。
另一个例子:

class GThread extends Thread
{
    public void run()
    {
        System.out.println("GThread: run()");
    }
   
    public void start()
    {
        System.out.println("GThread: start()");
    }
}
   
class GRunnable implements Runnable
{
    public void run()
    {
        System.out.println("GRunnable: run()");
    }
   
    public void start()
    {
        System.out.println("GRunnable: start()");
    }
}
   
public class MyTest 
{
    public static void main(String args[])
    {
        GThread gt  =  new GThread();
        GRunnable gr = new GRunnable();
        Thread thread  =  new Thread(gr);
        gt.start();
        thread.start();
    }
}

输出:

GThread: start()
GRunnable: run()

调用 GThread.start() 时,输出为:“GThread:start()”。当我们调用thread.start()时,新线程会调用runnable的run()方法,我们会得到“GRunnable:run()”消息。