天天看點

Java多線程

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...

上一篇: java多線程