關於Thread類中run()方法的一些見解
阿新 • • 發佈:2019-02-18
先看段程式碼:
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();
}
}
結果如下:
Thread:Thread-0
Thread:Thread-0
Thread:Thread-0
Thread:Thread-0
Thread:Thread-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…