java基本教程之常用的實(shí)現(xiàn)多線程的兩種方式 java多線程教程
關(guān)于線程池的內(nèi)容,我們以后會(huì)詳細(xì)介紹;現(xiàn)在,先對(duì)的Thread和Runnable進(jìn)行了解。本章內(nèi)容包括:
Thread和Runnable的簡(jiǎn)介
Thread和Runnable的異同點(diǎn)
Thread和Runnable的多線程的示例
Thread和Runnable簡(jiǎn)介
Runnable 是一個(gè)接口,該接口中只包含了一個(gè)run()方法。它的定義如下:
public interface Runnable {
public abstract void run();
}
Runnable的作用,實(shí)現(xiàn)多線程。我們可以定義一個(gè)類(lèi)A實(shí)現(xiàn)Runnable接口;然后,通過(guò)new Thread(new A())等方式新建線程。
Thread 是一個(gè)類(lèi)。Thread本身就實(shí)現(xiàn)了Runnable接口。它的聲明如下:
public class Thread implements Runnable {}
Thread的作用,實(shí)現(xiàn)多線程。
Thread和Runnable的異同點(diǎn)
Thread 和 Runnable 的相同點(diǎn):都是“多線程的實(shí)現(xiàn)方式”。
Thread 和 Runnable 的不同點(diǎn):
Thread 是類(lèi),而Runnable是接口;Thread本身是實(shí)現(xiàn)了Runnable接口的類(lèi)。我們知道“一個(gè)類(lèi)只能有一個(gè)父類(lèi),但是卻能實(shí)現(xiàn)多個(gè)接口”,因此Runnable具有更好的擴(kuò)展性。
此外,Runnable還可以用于“資源的共享”。即,多個(gè)線程都是基于某一個(gè)Runnable對(duì)象建立的,它們會(huì)共享Runnable對(duì)象上的資源。
通常,建議通過(guò)“Runnable”實(shí)現(xiàn)多線程!
Thread和Runnable的多線程示例
1. Thread的多線程示例
下面通過(guò)示例更好的理解Thread和Runnable,借鑒網(wǎng)上一個(gè)例子比較具有說(shuō)服性的例子。
// ThreadTest.java 源碼
class MyThread extends Thread{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println(this.getName()+" 賣(mài)票:ticket"+this.ticket--);
}
}
}
};
public class ThreadTest {
public static void main(String[] args) {
// 啟動(dòng)3個(gè)線程t1,t2,t3;每個(gè)線程各賣(mài)10張票!
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
t1.start();
t2.start();
t3.start();
}
}
運(yùn)行結(jié)果:
Thread-0 賣(mài)票:ticket10
Thread-1 賣(mài)票:ticket10
Thread-2 賣(mài)票:ticket10
Thread-1 賣(mài)票:ticket9
Thread-0 賣(mài)票:ticket9
Thread-1 賣(mài)票:ticket8
Thread-2 賣(mài)票:ticket9
Thread-1 賣(mài)票:ticket7
Thread-0 賣(mài)票:ticket8
Thread-1 賣(mài)票:ticket6
Thread-2 賣(mài)票:ticket8
Thread-1 賣(mài)票:ticket5
Thread-0 賣(mài)票:ticket7
Thread-1 賣(mài)票:ticket4
Thread-2 賣(mài)票:ticket7
Thread-1 賣(mài)票:ticket3
Thread-0 賣(mài)票:ticket6
Thread-1 賣(mài)票:ticket2
Thread-2 賣(mài)票:ticket6
結(jié)果說(shuō)明:
(01) MyThread繼承于Thread,它是自定義個(gè)線程。每個(gè)MyThread都會(huì)賣(mài)出10張票。
(02) 主線程main創(chuàng)建并啟動(dòng)3個(gè)MyThread子線程。每個(gè)子線程都各自賣(mài)出了10張票。
2. Runnable的多線程示例
下面,我們對(duì)上面的程序進(jìn)行修改。通過(guò)Runnable實(shí)現(xiàn)一個(gè)接口,從而實(shí)現(xiàn)多線程。
// RunnableTest.java 源碼
class MyThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+" 賣(mài)票:ticket"+this.ticket--);
}
}
}
};
public class RunnableTest {
public static void main(String[] args) {
MyThread mt=new MyThread();
// 啟動(dòng)3個(gè)線程t1,t2,t3(它們共用一個(gè)Runnable對(duì)象),這3個(gè)線程一共賣(mài)10張票!
Thread t1=new Thread(mt);
Thread t2=new Thread(mt);
Thread t3=new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
運(yùn)行結(jié)果:
Thread-0 賣(mài)票:ticket10
Thread-2 賣(mài)票:ticket8
Thread-1 賣(mài)票:ticket9
Thread-2 賣(mài)票:ticket6
Thread-0 賣(mài)票:ticket7
Thread-2 賣(mài)票:ticket4
Thread-1 賣(mài)票:ticket5
Thread-2 賣(mài)票:ticket2
Thread-0 賣(mài)票:ticket3
Thread-1 賣(mài)票:ticket1
結(jié)果說(shuō)明:
(01) 和上面“MyThread繼承于Thread”不同;這里的MyThread實(shí)現(xiàn)了Thread接口。
(02) 主線程main創(chuàng)建并啟動(dòng)3個(gè)子線程,而且這3個(gè)子線程都是基于“mt這個(gè)Runnable對(duì)象”而創(chuàng)建的。運(yùn)行結(jié)果是這3個(gè)子線程一共賣(mài)出了10張票。這說(shuō)明它們是共享了MyThread接口的。
- Java多線程中的單例模式兩種實(shí)現(xiàn)方式
- Java多線程實(shí)現(xiàn)的兩種方式
- 詳細(xì)解讀JAVA多線程實(shí)現(xiàn)的三種方式
- java實(shí)現(xiàn)多線程的兩種方式繼承Thread類(lèi)和實(shí)現(xiàn)Runnable接口的方法
- 總結(jié)Java中線程的狀態(tài)及多線程的實(shí)現(xiàn)方式
- 詳解Java實(shí)現(xiàn)多線程的三種方式
- Java 實(shí)現(xiàn)多線程的幾種方式匯總
- Java多線程的實(shí)現(xiàn)方式比較(兩種方式比較)
- 詳解三種java實(shí)現(xiàn)多線程的方式
- 淺談Java的兩種多線程實(shí)現(xiàn)方式
相關(guān)文章
Sharding-jdbc報(bào)錯(cuò):Missing the data source
在使用MyBatis-plus進(jìn)行數(shù)據(jù)操作時(shí),新增Order實(shí)體屬性后,出現(xiàn)了數(shù)據(jù)源缺失的提示錯(cuò)誤,原因是因?yàn)閡serId屬性值使用了隨機(jī)函數(shù)生成的Long值,這與sharding-jdbc的路由規(guī)則計(jì)算不匹配,導(dǎo)致無(wú)法找到正確的數(shù)據(jù)源,通過(guò)調(diào)整userId生成邏輯2024-11-11
SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級(jí)問(wèn)題
這篇文章主要介紹了SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級(jí)問(wèn)題,需要的朋友可以參考下2018-11-11
SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀
這篇文章主要介紹了SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹(shù)
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
Java批量操作文件系統(tǒng)的實(shí)現(xiàn)示例
文件上傳和下載是java web中常見(jiàn)的操作,本文主要介紹了Java批量操作文件系統(tǒng)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
JavaEE賬號(hào)注冊(cè)模擬網(wǎng)站郵箱激活
這篇文章主要為大家詳細(xì)介紹了JavaEE賬號(hào)注冊(cè)模擬網(wǎng)站郵箱激活,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
netflix.discovery.shared.transport.TransportException:Cannot
這篇文章主要介紹了netflix.discovery.shared.transport.TransportException:Cannot execute request on any known server報(bào)錯(cuò)問(wèn)題及解決方法,感興趣的朋友一起看看吧2023-09-09
dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程
這篇文章主要給大家介紹了關(guān)于dubbo新手學(xué)習(xí)之事件通知實(shí)踐的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

