1.簡單Java多線程例子(繼承Thread)
某一次的執行結果為:
B運作...0
B運作...1
B運作...2
C運作...0
A運作...0
C運作...1
B運作...3
C運作...2
A運作...1
C運作...3
B運作...4
C運作...4
A運作...2
A運作...3
A運作...4
2.簡單Java多線程例子(實作Runnable接口)
某一次的執行結果為
線程A運作...0
線程A運作...1
線程A運作...2
線程B運作...0
線程B運作...1
線程A運作...3
線程C運作...0
線程A運作...4
線程B運作...2
線程B運作...3
線程C運作...1
線程B運作...4
線程C運作...2
線程C運作...3
線程C運作...4
Thread也是實作Runnable接口的,Thread中的run方法調用的是Runnable接口的run方法。Thread和Runnable都實作了run方法,這種操作模式其實就是代理模式。
Thread和Runnable的差別:
如果一個類繼承Thread,則不适合資源共享。但是如果實作了Runable接口的話,則很容易的實作資源共享。
如果是一個買票系統,如果count表示的是車票的數量,使用Runnable接口
1号視窗正在買票5
3号視窗正在買票3
2号視窗正在買票4
3号視窗正在買票1
1号視窗正在買票2
總結:
實作Runnable接口比繼承Thread類所具有的優勢:
1):适合多個相同的程式代碼的線程去處理同一個資源
2):可以避免java中的單繼承的限制
3):增加程式的健壯性,代碼可以被多個線程共享,代碼和資料獨立。
建議盡量使用Runnable接口
某一次的執行結構為
A
B
Thread-0
如果我們沒有指定名字的話,系統自動提供名字。
提醒一下大家:main方法其實也是一個線程。在java中是以的線程都是同時啟動的,至于什麼時候,哪個先執行,完全看誰先得到CPU的資源。
在java中,每次程式運作至少啟動2個線程。一個是main線程,一個是垃圾收集線程。因為每當使用java指令執行一個類的時候,實際上都會啟動一個JVM,每一個JVM實習在就是在作業系統中啟動了一個程序。
判斷線程是否啟動
線程啟動之前---》false
線程啟動之後---》true
主線程也有可能在子線程結束之前結束。并且子線程不受影響,不會因為主線程的結束而結束。
線程的強制執行
main 線程執行-->0
線程
main 線程執行-->1
main 線程執行-->2
main 線程執行-->3
main 線程執行-->4
main 線程執行-->5
main 線程執行-->6
main 線程執行-->7
main 線程執行-->8
main 線程執行-->9
線程的休眠
某一次的執行結果
Thu May 15 15:01:11 CST 2014
Thu May 15 15:01:13 CST 2014
線程0
Thu May 15 15:01:15 CST 2014
線程1
Thu May 15 15:01:17 CST 2014
線程2
線程的中斷
執行run方法
Thu May 15 15:05:04 CST 2014
Thu May 15 15:05:06 CST 2014
休眠被打斷
守護線程
執行結果
Hello world!!!
線程在運作
如果沒有System.out.println("Hello world!!!");這句,run方法裡面的語句不會執行
線程的優先級
A運作0
A運作1
A運作2
B運作0
C運作0
B運作1
A運作3
B運作2
C運作1
B運作3
A運作4
B運作4
C運作2
C運作3
C運作4
誰先執行還是取決于誰先去的CPU的資源,主線程的優先級是5
線程的禮讓
線上程操作中,也可以使用yield()方法,将一個線程的操作暫時交給其他線程執行
線程同步
在買票的程式中需要考慮線程同步保證資料不出錯
格式
例
5
4
3
2
1
每秒鐘輸出一個
也可以采用同步方法。
文法格式為
采用同步方法解決上面的問題
執行效果和上面的同步線程完全一樣。
當多個線程共享一個資源的時候需要進行同步,但是過多的同步可能導緻死鎖。
經典的生産者和消費者問題············To be continued...