在生活中我們時常會遇到同步的問題,而且大多數的實際問題都是線程的同步問題 我這裡以生活中的火車售票來進行舉例: 假設現在我們總共有1000張票要進行出售,共有10個出售點,那麼當售票到最後只有一張票時,每個售票點如何去處理這唯一的一張票?或者對於某一張票而言,假設它正在售票站1售票的程式執行過程中, ...
在生活中我們時常會遇到同步的問題,而且大多數的實際問題都是線程的同步問題
我這裡以生活中的火車售票來進行舉例:
假設現在我們總共有1000張票要進行出售,共有10個出售點,那麼當售票到最後只有一張票時,每個售票點如何去處理這唯一的一張票?或者對於某一張票而言,假設它正在售票站1售票的程式執行過程中,但是還沒有出售,那麼此時,其他售票站改如何去處理這張票呢?
這時,應該考慮使用java中的同步機制;
方法一:使用Runnable介面實現
package thread; public class TSynchronize { public static void main(String[]ages){ int l=10; Syn []s=new Syn[l]; Thread [] t=new Thread[l];
//創建10個火車票售票點 for(int i=0;i<l;i++){ s[i]=new Syn(); t[i]=new Thread(s[i]); t[i].setName((i+1)+"號口"); }
//啟動線程 for(int i=0;i<l;i++){ t[i].start(); } } } class Syn implements Runnable{ private static int count=1000; //總共的票數 private static String key="key"; //synchronized是為了實現同步,其中所管轄的代碼塊要麼全執行,要不全不執行 //synchronized如果修飾的是函數,則指調用它的函數的對象 ,它不需要字元串,預設為this;如果修飾的是代碼塊則需要使用字元串 public void run(){ while(count>0){ synchronized(key){ //synchronized 可以修飾函數和代碼塊 key 線程執行時的令牌口令,可以是任何值 if(count>0){ System.out.println("第"+Thread.currentThread().getName()+"在賣第"+(1001-count)+"張票"); count--; }else{ break; } } } System.out.println("第"+Thread.currentThread().getName()+"的票已經賣完"); } }
執行結果:
方法二:繼承Thread類:
package thread; public class TSynClass { public static void main(String []ages){ int l=10; Point[] p=new Point[10]; for(int i=0;i<l;i++){ p[i]=new Point (); p[i].setName((i+1)+"號口"); } for(int i=0;i<l;i++){ p[i].start(); } } } class Point extends Thread{ private static int count =1000; //共用票數 private static String key="key"; //共用線程口令,讓其進行爭奪 public void run(){ while(count>0){ synchronized(key){ //兩個線程的key是自己的,不是公共的 if(count>0){ System.out.println("第"+this.currentThread().getName()+"正在買第"+(1001-count)+"張票"); count--; }else{ break; } } } System.out.println("第"+this.currentThread().getName()+"的票已經賣完"); } }
執行結果: