Java多線程之 Thread VS Runnable



爲此,我們舉個例子,假設有火車站三個窗口,在賣火車票,總共只有5張票。每一個線程相當於一個窗口,分別售票

[java] view plaincopy
  1. <strong>package com.thread;  
  2.   
  3. class myThread extends Thread{  
  4.       
  5.     private int ticketsCount=5;//一種有5張票  
  6.     private String name;//窗口,也即是線程的名字  
  7.       
  8.     public myThread(String name){  
  9.         this.name=name;  
  10.     }  
  11.   
  12.     @Override  
  13.     public void run() {  
  14.         while(ticketsCount>0) {  
  15.             //ticketsCount--;//如果還有票,就賣掉一張  
  16.             System.out.println(name+"有"+ticketsCount+"張票,賣了1一張票,剩餘票數爲:"+ --ticketsCount);  
  17.             //System.out.println(name+"賣了1一張票,剩餘票數爲:"+ticketsCount);  
  18.         }  
  19.     }  
  20.   
  21.       
  22.       
  23. }  
  24. public class TicketsTread {  
  25.   
  26.         public static void main(String args[]) {  
  27.             //創建三個線程,模擬三個窗口賣票  
  28.             myThread t1=new myThread("窗口1");  
  29.             myThread t2=new myThread("窗口2");  
  30.             myThread t3=new myThread("窗口3");  
  31.               
  32.             //啓動這三個線程,也即是窗口開始賣票  
  33.             t1.start();  
  34.             t2.start();  
  35.             t3.start();  
  36.         }  
  37. }  
  38.   
  39. </strong>  



輸出爲:



這樣的結果說明了,每個窗口(線程)都賣了5張票,這是因爲創建了3個Thread對象,每個對象有自己的成員實例變量。

因爲每個線程,mt1,mt2,mt3分別是一個繼承了Thread類的一個對象,所以對象擁有其所屬類的私有或共有的成員變量或者成員方法,也就是說他們的變量,也即是票數ticketCount都是每個對象“自己”私有的,“各自爲營”,資源並不是共享的。 那麼,你就會看到,每個窗口都有5張票的情況咯。。


再使用runnable 來實現這個示例。


[java] view plaincopy
  1. package com.thread;  
  2.   
  3. class myThread_Runnable implements Runnable{  
  4.     private int ticketsCount=5;//一種有5張票  
  5.       
  6.     public void run() {//如果給run方法加鎖,那麼會出現一個窗口會賣光所有票的現象  
  7.         while(ticketsCount>0) {  
  8.             ticketsCount--;//如果還有票,就賣掉一張  
  9.             System.out.println(Thread.currentThread().getName()+"賣了1一張票,剩餘票數爲:"+ticketsCount);  
  10.         }  
  11.     }  
  12.   
  13. }  
  14.   
  15. public class TicketsRunnable {  
  16.       
  17.         public static void main(String args[]){  
  18.             myThread_Runnable mt=new myThread_Runnable();  
  19.             //創建三個線程,來模擬三個售票窗口  
  20.             Thread t1=new Thread(mt,"窗口1");  
  21.             Thread t2=new Thread(mt,"窗口2");  
  22.             Thread t3=new Thread(mt,"窗口3");  
  23.               
  24.             //啓動這三個線程,也即是三個窗口,開始賣票  
  25.             t1.start();  
  26.             t2.start();  
  27.             t3.start();  
  28.         }  
  29. }  


上面這個是一個及其特殊的情況,線程(窗口)1一次性的使用了CPU並執行完了了run方法的所有代碼,然後進程結束。

下面這個是一般性的結果:


上面這個輸出就可以看出來,線程資源搶奪所導致的交叉執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章