重写 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()”消息。