多執行緒詳細分析與介紹

2021-06-04 13:16:31 字數 4641 閱讀 7178

傳統的實現多執行緒的方法有兩種:

1.      通過繼承thread,並重寫run方法來實現

2.      通過實現runnable介面重寫run方法來實現

下面舉例說明兩種實現方法:

public class mythread extends thread

publicvoid run()

//要實現的**

public class mythread2 implements runnable

publicvoid run()

//實現**

public class threadtest

publicstatic void main(string args)

newmythread().start();

mythread2 thread=new mythread2();

newthread(thread).start();

newthread(thread).start();

通過上述**,我們可以看出執行緒最基本的使用方法,同時我們也發現通過實現runnbale介面實現的執行緒。可以共享同乙份資料,所以在編寫多執行緒的程式是我們大多數還是會使用第二種方法的,第二種方法可以為我們帶來很多意想不到的方便。

多執行緒的呼叫原理:

多執行緒的呼叫是cpu隨機呼叫的,也就是說誰先得到cpu的資源誰先執行,如果乙個執行緒開始執行,但是並不是得等到這個執行緒執行完以後別的執行緒才能呼叫,在上乙個執行緒執行的過程期間,別的執行緒也會得到執行,只不過是多個執行緒一起爭奪cpu,誰搶到誰執行,所以我們可以看到多個執行緒似乎是一起執行的。

多執行緒的安全問題:

安全問題要使用synchronized關鍵字,使用方法有synchronized塊和synchronized方法,

synchronized有乙個鎖(乙個物件),當進入塊或方法或鎖變為0,其餘用同一物件作為鎖的方法不能被訪問直到這個方法執行完。

下面給乙個買票系統的例子:

packagecom.li;

public classthreadsafe

}}).start();

newthread(newrunnable()

}}).start();

}static classtrainticket}}

}執行結果:

thread-1sell99

thread-1sell98

thread-1sell97

thread-1sell96

thread-1sell95

thread-1sell94

thread-1sell93

thread-1sell92

thread-1sell91

thread-1sell90

thread-1sell89

thread-1sell88

thread-1sell87

thread-1sell86

thread-1sell85

thread-1sell84

thread-1sell83

thread-1sell82

thread-1sell81

thread-1sell80

thread-1sell79

thread-1sell78

thread-1sell77

thread-1sell76

thread-1sell75

thread-1sell74

thread-1sell73

thread-1sell72

thread-1sell71

thread-1sell70

thread-1sell69

thread-1sell68

thread-1sell67

thread-1sell66

thread-1sell65

thread-1sell64

thread-1sell63

thread-1sell62

thread-1sell61

thread-1sell60

thread-1sell59

thread-1sell58

thread-0sell57

thread-0sell56

thread-0sell55

thread-0sell54

thread-0sell53

thread-0sell52

thread-0sell51

thread-0sell50

thread-0sell49

thread-0sell48

thread-0sell47

thread-0sell46

thread-0sell45

thread-0sell44

thread-0sell43

thread-0sell42

thread-0sell41

thread-0sell40

thread-0sell39

thread-1sell38

thread-1sell37

thread-1sell36

thread-1sell35

thread-1sell34

thread-1sell33

thread-1sell32

thread-1sell31

thread-1sell30

thread-1sell29

thread-1sell28

thread-1sell27

thread-1sell26

thread-1sell25

thread-1sell24

thread-1sell23

thread-1sell22

thread-1sell21

thread-1sell20

thread-1sell19

thread-1sell18

thread-1sell17

thread-1sell16

thread-1sell15

thread-1sell14

thread-1sell13

thread-1sell12

thread-1sell11

thread-1sell10

thread-1sell9

thread-1sell8

thread-1sell7

thread-1sell6

thread-1sell5

thread-1sell4

thread-1sell3

thread-1sell2

thread-1sell1

thread-1sell0

最後介紹一下執行緒之間的同步通訊問題:

通常會用wait和notify方法

當遇到wait是執行緒會阻塞,直到遇到同一物件呼叫的notify方法

下面給出乙個例項:

這個例子實現輸出乙個物件後,等待放入另乙個物件後再輸出,如此往復

packagecom.li.example;

/**此程式實現了執行緒的同步,考慮到了執行緒的安全性問題,同時還利用wait()和notify()實現了執行緒之間的通訊問題,

執行緒的執行機制,雖然啟動了乙個執行緒,但不是要完全等待乙個執行緒執行完才執行另外乙個執行緒,而是cpu動態的分配,可能乙個執行緒

正在執行,但cpu將資源分配給了另外乙個執行緒,這就有肯能造成執行緒的安全性問題,安全性問題可以用synchronized解決

*/classqcatch(interruptedexception e1)

this.name = name;

trycatch(exception e)

this.*** = ***;

qfull =true;

notify();

}public synchronized voidget()catch(interruptedexception e)

system.out.println(name);

system.out.println(***);

qfull =false;

notify();}}

classproducerimplementsrunnable

inti = 0;

public voidrun() }}

classconsumerimplementsrunnable

public voidrun() }}

classthreaddemo2

}

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...