更新時(shí)間:2022-08-05 10:34:19 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1180次
實(shí)現(xiàn)Java多線程demo用什么方式?動(dòng)力節(jié)點(diǎn)小編來告訴大家。
創(chuàng)建一個(gè)繼承于Thread類的子類
重寫Thread類的run() --> 將此線程執(zhí)行的操作聲明在run()中
創(chuàng)建Thread類的子類的對(duì)象
通過此對(duì)象調(diào)用start():①啟動(dòng)當(dāng)前線程 ② 調(diào)用當(dāng)前線程的run()
創(chuàng)建一個(gè)實(shí)現(xiàn)了Runnable接口的類
實(shí)現(xiàn)類去實(shí)現(xiàn)Runnable中的抽象方法:run()
創(chuàng)建實(shí)現(xiàn)類的對(duì)象
將此對(duì)象作為參數(shù)傳遞到Thread類的構(gòu)造器中,創(chuàng)建Thread類的對(duì)象
通過Thread類的對(duì)象調(diào)用start()
開發(fā)中:優(yōu)先選擇:實(shí)現(xiàn)Runnable接口的方式
原因:
1. 實(shí)現(xiàn)的方式?jīng)]類的單繼承性的局限性
2. 實(shí)現(xiàn)的方式更適合來處理多個(gè)線程共享數(shù)據(jù)的情況。
聯(lián)系:public class Thread implements Runnable
相同點(diǎn):兩種方式都需要重寫run(),將線程要執(zhí)行的邏輯聲明在run()中。
目前兩種方式,要想啟動(dòng)線程,都是調(diào)用的Thread類中的start()。
用偽代碼來表示:
//1. 創(chuàng)建一個(gè)繼承于Thread類的子類
class MyThread extends Thread {
//2. 重寫Thread類的run()
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
public class ThreadTest {
public static void main(String[] args) {
//3. 創(chuàng)建Thread類的子類的對(duì)象
MyThread t1 = new MyThread();
//4.通過此對(duì)象調(diào)用start():①啟動(dòng)當(dāng)前線程 ② 調(diào)用當(dāng)前線程的run()
t1.start();
//問題一:我們不能通過直接調(diào)用run()的方式啟動(dòng)線程。
// t1.run();
//問題二:再啟動(dòng)一個(gè)線程,遍歷100以內(nèi)的偶數(shù)。不可以還讓已經(jīng)start()的線程去執(zhí)行。會(huì)報(bào)IllegalThreadStateException
// t1.start();
//我們需要重新創(chuàng)建一個(gè)線程的對(duì)象
MyThread t2 = new MyThread();
t2.start();
//如下操作仍然是在main線程中執(zhí)行的。
for (int i = 0; i < 100; i++) {
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i + "***********main()************");
}
}
}
}
class Window1 implements Runnable{
private int ticket = 100;
@Override
public void run() {
while(true){
if(ticket > 0){
System.out.println(Thread.currentThread().getName() + ":賣票,票號(hào)為:" + ticket);
ticket--;
}else{
break;
}
}
}
}
public class WindowTest1 {
public static void main(String[] args) {
Window1 w = new Window1();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
不是所有的場(chǎng)合都適合多線程的使用,使用多線程要注意的問題也不少。如果大家想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,細(xì)致全面,很適合小白學(xué)習(xí),希望對(duì)大家能夠有所幫助。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743