先看一道題:以下多線程執(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();
看這個(gè)之前,我們先看一下java中把跨,Thread
是怎么實(shí)現(xiàn)run
方法的丧没。
我們先看第二張圖鹰椒,當(dāng)target(Runnable)
不為空的時(shí)候,run
方法才會被執(zhí)行呕童。
Thread 實(shí)現(xiàn)Runnable接口
Thread 重寫run方法
我們把上面代碼精簡一下漆际,可以得到如下代碼:
new Thread(runnable.run()){
run()
}.start();
首先
Thread
執(zhí)行start()
的時(shí)候,會先去執(zhí)行自己的run()
方法夺饲,只有當(dāng)自己的run()
為空的時(shí)候奸汇,才會去執(zhí)行父類的runnable
,因此上文被執(zhí)行的是System.out.println("2");
父類此時(shí)被子類覆蓋了往声。
new Thread(runnable.run()){ //只有當(dāng)自己的run()為空的時(shí)候才會被執(zhí)行
run() //第一個(gè)被執(zhí)行
}.start();
多線程的兩種方式
- 繼承Thread
- 實(shí)現(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();
②
//第二個(gè)線程 實(shí)現(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)浩销。