Linux教程網
Java 多線程賣票演示
- class Ticket implements Runnable
- {
- private int tick=100;
- //
- /*public void run()
- {
- while(tick>0)
- {
- try{Thread.sleep(10);}catch(Exception ex) {}
- //當現在tick=1時,而所有線程都在這個地方停止了,那麼這時就會出現 tick < 0 的情況 ,這就是多線程情況 的安全性問題
- System.out.println(Thread.currentThread().getName()+"..."+tick--);
- }
- }*/
- public void run()
- {
- while(true) //循環是指線程不停的去賣票
- {
- synchronized(this)//當操作的是共享數據時, 用同步代碼塊進行包圍起來,這樣在執行時,只能有一個線程執行同步代碼塊裡面的內容
- {
- if(tick>0)
- {
- //try{Thread.sleep(10);}catch(Exception ex) {}在同步代碼塊裡面睡覺,給不睡效果是一樣 的,作用只是自已不執行,也不讓線程執行
- System.out.println(Thread.currentThread().getName()+"..."+tick--);
- }else
- break;
- }
- try{Thread.sleep(100);}catch(Exception ex) {}//所以把睡覺放到同步代碼塊的外面,這樣賣完一張票就睡一會,讓其他線程再賣,這樣所有的線程都可以賣票
- }
- }
- }
-
- public class Sale {
-
-
- public static void main(String[] args) {
- Ticket ticket=new Ticket();
- Thread t1=new Thread(ticket);
- Thread t2=new Thread (ticket);
- Thread t3=new Thread(ticket);
- Thread t4=new Thread(ticket);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
-
- }
- /*
- * 多線程出現的安全性問題:
- * 在操作共享數據時,一條語句在沒有執行完的情況下,另外一語句參與進行,就會再現錯誤
- * 解決辦法 :
- * 在多條語句操作共享數據時, 在一個操作共享數據的語句沒有執行時,不能讓其他的線程進來
- *
- * Java中提供了同步代碼塊:
- * synchronized(對象)
- * {
- * }
- * 注意:
- * 不要同步代碼塊裡面睡覺,這樣會造成自己不執行,也不讓其他線程執行的後果
- *
- * 多線程 賣票: 創建多個線程,共同賣票
- *
- *
- * */ 2011/10/24 11:4:49
Copyright ©
Linux教程網 All Rights Reserved