1. 程式人生 > 遊戲 >傳微軟和三星合作 為三星電視開發Xbox串流App

傳微軟和三星合作 為三星電視開發Xbox串流App

賣票案例:

  1. 定義一個類Ticket實現Runnable介面,定義成員變數:privite int ticketCount=100;
  2. 在Ticket類中重寫run()方法實現賣票,程式碼步驟如下:
    • 判斷票數大於0,就賣票,並告知是哪個視窗賣的。
    • 票數-1
    • 賣光,執行緒截至。
  3. 定義測試類TicketDemo,main方法程式碼步驟如下:
    • 建立Ticket類的物件
    • 建立三個Thread類的物件,把Ticket物件作為構造引數,並給出對應的視窗名稱。
    • 啟動執行緒

 實際生活中賣票需要時間,所以出售一張票時,需要一點時間延遲,用sleep()方法實現。

  賣票出現問題:相同的票賣了多次;出現了負數票。

賣票安全問題解決

  為什麼出現問題?--多執行緒操作資料

  如何解決?--讓程式沒有安全問題的環境

  怎麼實現?--把多條語句操作共享資料的程式碼給鎖起來,讓任意時刻只能有一個執行緒執行即可。

        同步程式碼塊解決。

同步程式碼塊:

  格式:synchronized(任意物件){

        多條語句操作共享資料的程式碼;

      }

  預設情況是開啟的,只要有一個執行緒進去執行程式碼,鎖就會關閉。

  單執行緒執行完畢,鎖才會自動開啟。

  好處和弊端:

    好處:解決多執行緒資料安全問題

    弊端:執行緒很多時,每個執行緒都會判斷同步上的鎖,很耗費資源,降低程式執行效率。

public class Ticket implements Runnable {
    //票數
    private int ticket = 100;
    private Object obj=new Object();

    @Override
    public void run() {
        while (true) {
            //多個執行緒必須使用同一把鎖
            synchronized (obj){
                if (ticket <= 0) {
                    //賣完了
                    break;
                } else {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticket--;
                    System.out.println(Thread.currentThread().getName() + "賣出1張,剩餘票數:" + ticket);
                }
            }
        }
    }
}

  

public class Demo {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();

        Thread thread1 = new Thread(ticket);
        Thread thread2 = new Thread(ticket);
        Thread thread3 = new Thread(ticket);

        thread1.setName("視窗1");
        thread2.setName("視窗2");
        thread3.setName("視窗3");
        thread1.start();
        thread2.start();
        thread3.start();

    }
}