先看一道題:以下多線程執(zhí)行的結(jié)果是什么?
new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1");
}
}
}
) {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
}
}.start();
看這個之前,我們先看一下java中,Thread是怎么實現(xiàn)run方法的。
我們先看第二張圖,當(dāng)target(Runnable)不為空的時候,run方法才會被執(zhí)行。

Thread 實現(xiàn)Runnable接口

Thread 重寫run方法
我們把上面代碼精簡一下,可以得到如下代碼:
new Thread(runnable.run()){
run()
}.start();
首先
Thread執(zhí)行start()的時候,會先去執(zhí)行自己的run()方法,只有當(dāng)自己的run()為空的時候,才會去執(zhí)行父類的runnable,因此上文被執(zhí)行的是System.out.println("2");父類此時被子類覆蓋了。
new Thread(runnable.run()){ //只有當(dāng)自己的run()為空的時候才會被執(zhí)行
run() //第一個被執(zhí)行
}.start();
多線程的兩種方式
- 繼承Thread
- 實現(xiàn) Runnable接口
①
//Thread的子類
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
thread.start();
②
//第二個線程 實現(xiàn)Runnable
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
注意:
以上為Demo,只演示代碼,但是會造成死循環(huán)。