傳統的實現多執行緒的方法有兩種:
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...