Java多執行緒 Java中的程序狀態

2021-08-15 06:23:57 字數 4137 閱讀 2586

乙個執行緒物件在它的生命週期內,需要經歷5個狀態

執行狀態(running)

​ 在執行狀態的執行緒執行自己的run方法中的**,直接呼叫其他方法而終止或等待某資源而阻塞或完成任務而死亡。如果在給定的時間片內沒有執行結束,就會被系統給換下來回到就緒狀態。也可能由於某些「導致阻塞的事件」而進入阻塞狀態。

阻塞狀態(blocked)

​ 阻塞指的是暫停乙個執行緒的執行以等待某個條件發生(如某資源就緒)。有4種原因會導致阻塞:

死亡狀態(terminated)

​ 死亡狀態是執行緒生命週期中的最後乙個階段。執行緒死亡的原因有兩個。

終止執行緒的典型方式

​ 終止執行緒我們一般不使用jdk提供的stop()或destroy()方法(它們本身也被jdk廢棄了)。通常的做法是提供乙個boolean型的終止變數,將這個變數置為false時,則終止執行緒的執行。

例子一:終止執行緒的典型方法(重要)

package com.shenqi.stopthread;

public

class

testthreadterminate

implements

runnable

@override

public

void

run()

}public

void

terminate()

public

static

void

main(string args)

//在terminate()方法中將live設定為false,終止執行緒。

threadstate.terminate();

system.out.println("threadstate is stop!");

}}

程式執行結果:

主線程:0

主線程:1

主線程:2

主線程:3

主線程:4

主線程:5

主線程:6

執行緒a0

主線程:7

主線程:8

主線程:9

主線程:10

主線程:11

主線程:12

主線程:13

主線程:14

主線程:15

主線程:16

主線程:17

主線程:18

主線程:19

主線程:20

主線程:21

主線程:22

主線程:23

主線程:24

主線程:25

主線程:26

主線程:27

主線程:28

主線程:29

主線程:30

主線程:31

主線程:32

執行緒a1

主線程:33

執行緒a2

主線程:34

執行緒a3

執行緒a4

主線程:35

執行緒a5

主線程:36

主線程:37

主線程:38

主線程:39

主線程:40

主線程:41

執行緒a6

主線程:42

主線程:43

主線程:44

主線程:45

主線程:46

主線程:47

主線程:48

主線程:49

主線程:50

主線程:51

主線程:52

主線程:53

執行緒a7

主線程:54

執行緒a8

主線程:55

執行緒a9

主線程:56

執行緒a10

主線程:57

執行緒a11

執行緒a12

執行緒a13

執行緒a14

執行緒a15

執行緒a16

執行緒a17

執行緒a18

執行緒a19

執行緒a20

執行緒a21

執行緒a22

執行緒a23

主線程:58

執行緒a24

主線程:59

主線程:60

主線程:61

主線程:62

主線程:63

主線程:64

主線程:65

主線程:66

主線程:67

主線程:68

主線程:69

主線程:70

主線程:71

主線程:72

主線程:73

主線程:74

主線程:75

主線程:76

主線程:77

主線程:78

執行緒a25

主線程:79

執行緒a26

主線程:80

主線程:81

執行緒a27

主線程:82

主線程:83

主線程:84

主線程:85

執行緒a28

主線程:86

執行緒a29

主線程:87

執行緒a30

主線程:88

執行緒a31

主線程:89

執行緒a32

執行緒a33

執行緒a34

主線程:90

執行緒a35

主線程:91

執行緒a36

主線程:92

主線程:93

主線程:94

執行緒a37

主線程:95

執行緒a38

主線程:96

主線程:97

主線程:98

主線程:99

執行緒a39

threadstate is

stop!

暫停執行緒執行sleep/yield

暫停執行緒執行常用的方法有sleep()和yield()方法,這兩個方法的區別是:

例子二:暫停執行緒的典型方法——sleep()

package com.shenqi.sleepthread;

public

class

testthreadsleep

}//使用繼承方法實現多執行緒

class

sleepthreadstate

extends

thread catch (interruptedexception e) }}

}

執行結果如下所示:(注:使用sleep()方法執行時可以感受到每條結果輸出之前的延遲。)

thread-1

:0thread-0

:0thread-1

:1thread-0

:1thread-0

:2thread-1

:2thread-1

:3thread-0

:3thread-1

:4thread-0

:4

例子二:暫停執行緒的典型方法——yield()

package com.shenqi.yieldthread;

public

class

testthreadyield

}//使用繼承方式實現多執行緒

class

statethreadyield

extends

thread

}}

執行結果如下所示:(注:yield()方法可以引起執行緒切換,但執行時沒有明顯延遲。)

thread-0

:0thread-0

:1thread-0

:2thread-0

:3thread-0

:4thread-1

:0thread-1

:1thread-1

:2thread-1

:3thread-1

:4thread-1

:5thread-0

:5thread-1

:6thread-0

:6thread-0

:7thread-1

:7thread-1

:8thread-0

:8thread-0

:9thread-1

:9

java中的多執行緒

package testthread 店員從生產者取貨,消費者從店員取貨,店員最多只能存放20個產品,當產品不夠20個需通知生產者生產,超過20個時停止消費 author passenger 店員類 class clerk catch interruptedexception e else 消費產品...

java中的多執行緒

建立執行緒的第一種方法 繼承thread類。步驟 1,定義乙個類繼承thread 2,複寫thread類中的run方法 目的 將自定義 儲存在run方法中,讓執行緒執行 3,呼叫執行緒的start方法,該方法用兩個作用 啟動執行緒,呼叫run方法 多執行緒的特性 隨機性 示例 class demo ...

java 中 的多執行緒

package wait 執行緒同步涉及的 同步控制 wait 使當前執行緒等待,不在爭搶cpu,並釋放同步 塊 或 同步方法的 鎖 notify 喚醒 某乙個 被 wait 的執行緒 notifyall 喚醒所有 被 wait 的執行緒 public class testwait implemen...