Java中線程的同步問題

來源:互聯網
上載者:User

標籤:sys   ble   i++   col   遇到   end   ima   10個   main   

      在生活中我們時常會遇到同步的問題,而且大多數的實際問題都是線程的同步問題

我這裡以生活中的火車售票來進行舉例:

  假設現在我們總共有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()+"的票已經賣完");    }}

執行結果:

  

 

Java中線程的同步問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.