1. 程式人生 > >關於Thread類中run()方法的一些見解

關於Thread類中run()方法的一些見解

先看段程式碼:

public class ThreadDemo
{
    public static void main(String[] args)
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while(true)
                {
                    System.out.println("Runnable:"+Thread.currentThread().getName());
                }
            }
        })
        {
            public
void run() { while(true) { System.out.println("Thread:"+Thread.currentThread().getName()); } } }.start(); } }

結果如下:

ThreadThread-0
ThreadThread-0
ThreadThread-0
ThreadThread-0
ThreadThread-0
...

再看段程式碼:

public class ThreadDemo
{
    public static void main(String[] args)
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while(true)
                {
                    System.out.println("Runnable:"+Thread.currentThread().getName());
                }
            }
        })
        {
            public
void run() { System.out.println("Thread子類run()方法在執行"); } }.start(); } }

結果如下:

Thread子類run()方法在執行

最後再看段程式碼:

public class ThreadDemo
{
    public static void main(String[] args)
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while(true)
                {
                    System.out.println("Runnable:"+Thread.currentThread().getName());
                }
            }
        })
        {

        }.start();
    }
}

結果如下:

Runnable:Thread-0
Runnable:Thread-0
Runnable:Thread-0
Runnable:Thread-0
Runnable:Thread-0
...

總結:第一段、第二段程式碼中,執行緒new的是Thread類的子類,子類覆蓋了父類的run()方法,那麼程式會執行該子類中的run()方法,並不會執行傳入該子類引數中的Runnable物件中的run()方法。若是沒有覆蓋,會去找父類(即Thread類)中的run方法,檢視原始碼Thread類中run()方法如下,

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

target是Runnable物件,如果target不為空,那麼就會執行Runnable中的run方法。第三段程式碼中傳入了Runnable物件,所以程式會執行該Runnable物件的run方法,程式中new Runnable()中的run()方法實現了Runnable介面中的run()方法,最終是Runnable物件執行自己的run()方法,所以執行結果為:Runnable:Thread-0…