模擬買票小練習-線程資源同步小練習-synchronized使用
模擬買票練習多線程
使用Thread和Runable練習買票和練習共享資源問題
方式一:繼承Thread類
1.首先定義一個ticks變量為總票數為10
1
2.定義run方法,循環的扣除票數量(簡單寫一下打印ticks票數)
1
3.模擬四個窗口購買票
1
問題1:打印的結果是每個窗口都打印了10張票,也就是說變量tickets沒有共享
解決1:通過給變量添加static,使變量變為共享變量如(代碼1)
解決2:通過實現runable接口解決共享變量問題(代碼2)
問題2:打印的ticks數量順序不是從10->1,順序亂了,也就是數據不同步
解決:通過代碼塊同步或者方法同步解決問題(加鎖)(代碼3、4)
代碼1:
package?com.lzw.java_thread.tickets;/** ?*?使用Thread和Runable練習買票和練習共享資源問題 ?*?方式一:繼承Thread類 ?*??????1.首先定義一個ticks變量為總票數為10 ?*??????2.定義run方法,循環的扣除票數量(簡單寫一下打印ticks票數) ?*??????3.模擬四個窗口購買票 ?*/public?class?ThreadTicks?extends?Thread{ ????private?static?int?tickets?=?10; ????@Override ????public?void?run()?{ ????????while?(tickets>0){ ????????????try?{ ????????????????Thread.sleep(1); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????} ????????????synchronized?(this){ ????????????????if?(tickets>0){ ????????????????????System.out.println(Thread.currentThread().getName()?+?"?剩余"?+?(tickets--)?+?"張票"); ????????????????} ????????????} ????????} ????} ????public?static?void?main(String[]?args)?{ ????????ThreadTicks?tt1?=?new?ThreadTicks(); ????????ThreadTicks?tt2?=?new?ThreadTicks(); ????????ThreadTicks?tt3?=?new?ThreadTicks(); ????????ThreadTicks?tt4?=?new?ThreadTicks(); ????????tt1.start(); ????????tt2.start(); ????????tt3.start(); ????????tt4.start(); ????}}1234567891011121314151617181920212223242526272829303132333435363738
代碼2:
package?com.lzw.java_thread.tickets;/** ?*第二種方式: ?*??????1.實現Runable接口 ?*??????2.創建四個線程都傳入一個Runable子類,實現對象資源共享 ?*??????3.調用start()方法 ?*/public?class?RunableTickets?implements?Runnable{ ????private?int?tickets?=?10; ????@Override ????public?void?run()?{ ????????while?(tickets>0){ ????????????try?{ ????????????????Thread.sleep(1); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????} ????????????if?(tickets>0){ ????????????????System.out.println(Thread.currentThread().getName()+"?剩余"+(tickets--)+"張票"); ????????????} ????????} ????} ????public?static?void?main(String[]?args)?{ ????????RunableTickets?rtt?=?new?RunableTickets(); ????????Thread?td1?=?new?Thread(rtt); ????????Thread?td2?=?new?Thread(rtt); ????????Thread?td3?=?new?Thread(rtt); ????????Thread?td4?=?new?Thread(rtt); ????????td1.start(); ????????td2.start(); ????????td3.start(); ????????td4.start(); ????}}123456789101112131415161718192021222324252627282930313233343536
代碼3:
package?com.lzw.java_thread.tickets;/** ?*?@Auther:?lzw ?*?使用同步代碼塊,實現共享資源同步 ?*/public?class?RunableTickets1?implements?Runnable{ ????private?int?tickets?=?10; ????@Override ????public?void?run()?{ ????????while?(tickets>0){ ????????????try?{ ????????????????Thread.sleep(100); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????} ????????????synchronized?(this){ ????????????????if?(tickets>0){ ????????????????????System.out.println(Thread.currentThread().getName()+"?剩余"+(tickets--)+"張票"); ????????????????} ????????????} ????????} ????} ????public?static?void?main(String[]?args)?{ ????????RunableTickets1?rtt?=?new?RunableTickets1(); ????????Thread?td1?=?new?Thread(rtt); ????????Thread?td2?=?new?Thread(rtt); ????????Thread?td3?=?new?Thread(rtt); ????????Thread?td4?=?new?Thread(rtt); ????????td1.start(); ????????td2.start(); ????????td3.start(); ????????td4.start(); ????}}12345678910111213141516171819202122232425262728293031323334353637
代碼4:
package?com.lzw.java_thread.tickets;/** ?*?@Auther:?lzw ?*?使用同步方法,實現共享資源同步 ?*/public?class?RunableTickets2?implements?Runnable{ ????private?int?tickets?=?10; ????@Override ????public?void?run()?{ ????????while?(tickets>0){ ????????????try?{ ????????????????Thread.sleep(100); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????} ????????????????this.sale(); ????????} ????} ????public?synchronized?void?sale(){ ????????if?(tickets>0){ ????????????System.out.println(Thread.currentThread().getName()+"?剩余"+(tickets--)+"張票"); ????????} ????} ????public?static?void?main(String[]?args)?{ ????????RunableTickets2?rtt?=?new?RunableTickets2(); ????????Thread?td1?=?new?Thread(rtt); ????????Thread?td2?=?new?Thread(rtt); ????????Thread?td3?=?new?Thread(rtt); ????????Thread?td4?=?new?Thread(rtt); ????????td1.start(); ????????td2.start(); ????????td3.start(); ????????td4.start(); ????}}
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。