多线程买票案例
測試類
package thead;public class testThread {public static void main(String [] arg){Tickets ticket = new Tickets();Thread t1 = new Thread(ticket,"窗口一:");Thread t2 = new Thread(ticket,"窗口二:");Thread t3 = new Thread(ticket,"窗口三:");t1.start();t2.start();t3.start();/* 注意:Thread中的start()方法是線程的就緒,而線程的啟動,需要等待CPU的調度(也就是所謂的線程搶資源);run()方法的方法體代表了線程需要完成的任務,稱之為線程執行體。void start() 使該線程開始執行;Java 虛擬機調用該線程的 run 方法。//即啟動線程start方法會自動調用該類中重寫的run方法*//* 同步鎖與資源共享:CPU可能隨機的在多個處于就緒狀態中的線程中進行切換,這時就可能出現線程的安全問題;線程安全問題,其實是指多線程環境下對共享資源的訪問可能會引起此共享資源的不一致性,而解決安全問題則需要同步鎖的加入,執行synchronized部分代碼的時候必須需要對象鎖,而一個對象只有一個鎖,只有執行完synchronized里面的代碼后釋放鎖,其他線程才可以獲得鎖,那么就保證了同一時刻只有一個線程訪問synchronized里面的代碼。實現資源共享的關鍵是,只有一個實例,synchronized使用的是同一把鎖,用實例的鎖或者定義一個實例。這就需要使用實現Runnable接口的方式,實現多線程,這樣傳入的是一個實例。繼承Thread的方式,傳入的是多個實例,每個實例都有一個鎖,那就無法實現控制。*/} }實現了runnable接口的類
package thead;public class Tickets implements Runnable{// 為了讓線程共享一個資源所以我們定義一個靜態成員變量private static int tickets = 100;Object obj = new Object();@Overridepublic void run() {while (true) {synchronized (Tickets.class) {try {if (tickets > 0) {// Thread.sleep(100); 只是為了打印的效果,一行一行打印,如果不加則,所有結果一下子全都出來了// getName:獲取線程的名字,就是main方法里的第二個參數System.out.println(Thread.currentThread().getName() + "正在售出第" + (tickets--) + "張票");}} catch (Exception e) {e.printStackTrace();}}}} }總結
- 上一篇: linux内核时钟驱动,4.9版本的li
- 下一篇: postman怎么不登陆使用_最新百度云