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