Java多线程两种实现方式的对比
Java多線程兩種實現方式的對比
一種,直接繼承Thread類
一種,實現Thread類的Runnable接口
兩種方式的區別
比如,售票廳有四個窗口,可以發售某日某次列出的100張車票,此時,100張車票可以看作是共享資源,四個售票窗口需要創建四個線程
可以通過Thread的currentThread()方法,得到當前的線程的實例對象,然后,調用getName()方法,可以獲取到線程的名稱
繼承Thread類,實現多線程
示例,Example04.java
public class Example04{public static void main(String[] args){new TicketWindow().start(); // 創建一個線程對象TicketWindows并開啟new TicketWindow().start(); // 創建一個線程對象TicketWindows并開啟new TicketWindow().start(); // 創建一個線程對象TicketWindows并開啟new TicketWindow().start(); // 創建一個線程對象TicketWindows并開啟} } class TicketWindow extends Thread{private int tickets=100;public void run(){// 通過死循環語句,打印語句while(true){if (tickets>0){// 獲取當前線程// 獲取當前線程的名稱Thread th=Thread.currentThread();String th_name=th.getName();System.out.println(th_name+"正在發售第"+tickets--+"張票");}}}}編譯運行
可以看出,每張票都被打印了四次
原因,四個線程沒有共享100張票,而是各自出售了100張票
在程序中創建了四個TicketWindow對象,就等于創建了四個售票程序,每個程序中都有100張票,每個線程在獨立的處理各自的資源
注意,每個線程都有自己的名字,主線程默認的名字為main,用戶創建的第一個線程的默認名字為Thread-0,第二個線程的默認名字為Thread-1,依次類推,如果,希望指定線程的名稱,可以通過調用setName(String name)為線程設置名稱
由于,現實生活中,系統中的車票資源是共享的,顯然上面的運行結果不合理
為了保證資源共享,在程序中只能創建一個售票對象,然后,開啟多個線程去運行同一個售票對象的售票方法,簡單來說,就是四個線程運行同一個售票程序,此時,就需要用到線程的第二種實現方式
實現Runnable接口,實現多線程
示例,Example05.java
public class Example05{public static void main(String[] args){TicketWindow tw=new TicketWindow();new Thread(tw,"窗口1").start(); // 創建線程對象,并命名為窗口1,開啟線程new Thread(tw,"窗口2").start(); // 創建線程對象,并命名為窗口2,開啟線程new Thread(tw,"窗口3").start(); // 創建線程對象,并命名為窗口3,開啟線程new Thread(tw,"窗口4").start(); // 創建線程對象,并命名為窗口4,開啟線程} } class TicketWindow implements Runnable{private int tickets=100;public void run(){while(true){if (tickets>0){// 獲取當前線程// 呼氣當前線程的名稱Thread th=Thread.currentThread();String th_name=th.getName();System.out.println(th_name+"正在發售第"+tickets--+"張票");}}} }編譯運行
代碼說明
只創建了一個TicketWindow對象,然后,創建了四個線程,在每個線程上都去調用TicketWindow對象中的run()方法,這樣,就可以保證四個線程訪問的是同一個tickets變量,共享100張車票
可以看出,實現Runnable接口,相對于繼承Thread類來說
優勢如下
1、適合多個相同程序代碼的線程,去處理同一個資源的情況,把線程同程序代碼、數據有效的分離,很好的體現了面向對象的設計思想
2、可以避免由于Java的單繼承,帶來的局限性
在程序中,經常遇到這種情況,就是使用一個已經繼承了某一個類的子類,創建線程,由于,一個類不能同時有兩個父類,所以,不能用繼承Thread類的方式,那么,只能采用實現Runnable接口的方式
實際中,大多數應用程序都會采用,實現Runnable接口的方式來創建多線程
總結
以上是生活随笔為你收集整理的Java多线程两种实现方式的对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现Runnable接口创建多线
- 下一篇: Java前台线程与后台线程