線程的同步(協調)synchronized
阿新 • • 發佈:2018-09-02
while catch 判斷 端口 print name dex inf sleep
多線程同時訪問一個數據池時,可能發生沖突,產生異常數據(理解為:多條公路進入同一城市,車輛無序發生混亂)。
使用Runnable接口管理多線程:可以理解為多條公路(線程)通過一個收費站(Runnable接口),達到車輛(run)有序通過的目的。
if條件盡量前置,否則,先執行再判斷。
【格式】
synchronized void method(){...} 關鍵字在方法前,每次只允許一個線程調用此方法
synchronized(Object){...} 關鍵字在代碼塊前,每次只允許一個線程調用此代碼塊
【舉例】:通過不同方式購買車票後,查詢余票數目。3個線程:手機電腦端、櫃臺、自助售票機
classMyThreadRunnalbe implements Runnable { int num = 10;//車票總數 public void run() {//線程要執行的任務 while (true) { synchronized (this) {//同步(協調)代碼塊 if (num > 0) {//條件盡量前置 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ "購買,余票:" + num--); } else break; } } } } public class Demo { public static void main(String[] args) { MyThreadRunnalbe mtr = new MyThreadRunnalbe();//創建端口對象(以下3個線程共同使用這1個端口) Thread tA = new Thread(mtr, "手機電腦端");// 以該類對象分別實例化4個線程 Thread tB = newThread(mtr, "櫃臺"); Thread tC = new Thread(mtr, "自助售票機"); // //不可以分別new MyThreadRunnalbe(),3個接口使得3個線程各自執行,無法達到有序的目的 // Thread tA = new Thread(new MyThreadRunnalbe(), "手機電腦端"); // Thread tB = new Thread(new MyThreadRunnalbe(), "櫃臺"); // Thread tC = new Thread(new MyThreadRunnalbe(), "自助售票機"); tA.start();// 分別啟動線程 tB.start(); tC.start(); } }
或者,同步(協調)方法sell()
class MyThreadRunnalbe implements Runnable { int num = 10;//車票總數 public void run() {//線程要執行的任務 while (true) { sell();//調用sell方法 if (num <= 0) break; } } public synchronized void sell() {//創建sell方法,並同步(協調) if (num > 0) {//條件盡量前置 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "購買,余票:" + num--); } } } public class Demo { public static void main(String[] args) { MyThreadRunnalbe mtr = new MyThreadRunnalbe();//創建端口對象(以下3個線程共同使用這1個端口) Thread tA = new Thread(mtr, "手機電腦端");// 以該類對象分別實例化4個線程 Thread tB = new Thread(mtr, "櫃臺"); Thread tC = new Thread(mtr, "自助售票機"); // //不可以分別new MyThreadRunnalbe(),3個接口使得3個線程各自執行,無法達到有序的目的 // Thread tA = new Thread(new MyThreadRunnalbe(), "手機電腦端"); // Thread tB = new Thread(new MyThreadRunnalbe(), "櫃臺"); // Thread tC = new Thread(new MyThreadRunnalbe(), "自助售票機"); tA.start();// 分別啟動線程 tB.start(); tC.start(); } }
線程的同步(協調)synchronized