Java線程控制權(quán)源代碼的深入探討
Java線程控制權(quán)的問題十分重要,我們?cè)诓粩嗟膶W(xué)習(xí)中需要不斷的注意相關(guān)的問題。下面我們就來看看在源代碼中Java線程控制權(quán)式如何體現(xiàn)的。當(dāng)wait的時(shí)候其實(shí)就是已經(jīng)放出了線程的控制權(quán),所以one可以運(yùn)行。one運(yùn)行時(shí)調(diào)用notify后又喚醒了two線程所以打印順序才是:
wait
sleep
wake up
我覺得我解釋的已經(jīng)很清楚了。wait被調(diào)用的時(shí)候放棄鎖,而控制線程是否能使用內(nèi)容的關(guān)鍵就在于鎖,wait并不是thread的內(nèi)容,而來自于object。你可以這樣來理解wait,我wait下就把接力棒交出去了,我當(dāng)前的這個(gè)線程就暫停運(yùn)行,記住是當(dāng)前的線程。然后當(dāng)我交出的接力棒已經(jīng)又回到我手中的時(shí)候,也就是說其他的線程已經(jīng)完成了任務(wù)。這個(gè)時(shí)候我拿到接力棒繼續(xù)奔跑。
有時(shí)候你應(yīng)該把問題簡單化,建議你看看thinking in java第四版,我明白你是想觀察阻塞的出現(xiàn),你可以將one。start放到two。start的上邊就會(huì)明白什么意思了
- package test;
- import java.util.LinkedList;
- public class Test_2_A2 {
- public static void main(String[] args) {
- SubTreadOne one = new SubTreadOne();
- SubTreadTwo two = new SubTreadTwo(one);
- two.start();
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- one.start();
- }
- }
- class SubTreadOne extends Thread {
- public SubTreadOne() {
- }
- public void run() {
- try {
- System.out.println("sleep");
- Thread.sleep(3000);
- synchronized (this) {
- this.notifyAll();
- }
- }catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- class SubTreadTwo extends Thread {
- SubTreadOne one;
- public SubTreadTwo(SubTreadOne one) {
- this.one = one;
- }
- public SubTreadTwo() {
- }
- public void run() {
- try {
- synchronized (one) {
- System.out.println("wait");
- one.wait();
- System.out.println("wake up");
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
以上就是對(duì)Java線程控制權(quán)有關(guān)代碼的詳細(xì)介紹。
【編輯推薦】