傳微軟和三星合作 為三星電視開發Xbox串流App
阿新 • • 發佈:2022-05-07
賣票案例:
- 定義一個類Ticket實現Runnable介面,定義成員變數:privite int ticketCount=100;
- 在Ticket類中重寫run()方法實現賣票,程式碼步驟如下:
- 判斷票數大於0,就賣票,並告知是哪個視窗賣的。
- 票數-1
- 賣光,執行緒截至。
- 定義測試類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(); } }