Java多執行緒之 Thread VS Runnable 【帶案例】
阿新 • • 發佈:2019-02-06
為此,我們舉個例子,假設有火車站有三個視窗,在賣火車票,總共只有5張票。每一個執行緒相當於一個視窗,分別售票
<strong>package com.thread; class myThread extends Thread{ private int ticketsCount=5;//一種有5張票 private String name;//視窗,也即是執行緒的名字 public myThread(String name){ this.name=name; } @Override public void run() { while(ticketsCount>0) { //ticketsCount--;//如果還有票,就賣掉一張 System.out.println(name+"有"+ticketsCount+"張票,賣了1一張票,剩餘票數為:"+ --ticketsCount); //System.out.println(name+"賣了1一張票,剩餘票數為:"+ticketsCount); } } } public class TicketsTread { public static void main(String args[]) { //建立三個執行緒,模擬三個視窗賣票 myThread t1=new myThread("視窗1"); myThread t2=new myThread("視窗2"); myThread t3=new myThread("視窗3"); //啟動這三個執行緒,也即是視窗開始賣票 t1.start(); t2.start(); t3.start(); } } </strong>
輸出為:
這樣的結果說明了,每個視窗(執行緒)都賣了5張票,這是因為建立了3個Thread物件,每個物件有自己的成員例項變數。
因為每個執行緒,mt1,mt2,mt3分別是一個繼承了Thread類的一個物件,所以物件擁有其所屬類的私有或共有的成員變數或者成員方法,也就是說他們的變數,也即是票數ticketCount都是每個物件“自己”私有的,“各自為營”,資源並不是共享的。 那麼,你就會看到,每個視窗都有5張票的情況咯。。
再使用runnable 來實現這個示例。
package com.thread; class myThread_Runnable implements Runnable{ private int ticketsCount=5;//一種有5張票 public void run() {//如果給run方法加鎖,那麼會出現一個視窗會賣光所有票的現象 while(ticketsCount>0) { ticketsCount--;//如果還有票,就賣掉一張 System.out.println(Thread.currentThread().getName()+"賣了1一張票,剩餘票數為:"+ticketsCount); } } } public class TicketsRunnable { public static void main(String args[]){ myThread_Runnable mt=new myThread_Runnable(); //建立三個執行緒,來模擬三個售票視窗 Thread t1=new Thread(mt,"視窗1"); Thread t2=new Thread(mt,"視窗2"); Thread t3=new Thread(mt,"視窗3"); //啟動這三個執行緒,也即是三個視窗,開始賣票 t1.start(); t2.start(); t3.start(); } }
上面這個是一個及其特殊的情況,執行緒(視窗)1一次性的使用了CPU並執行完了了run方法的所有程式碼,然後程序結束。
下面這個是一般性的結果:
上面這個輸出就可以看出來,執行緒資源搶奪所導致的交叉執行。