Java線程控制權源代碼的深入探討
Java線程控制權的問題十分重要,我們在不斷的學習中需要不斷的注意相關的問題。下面我們就來看看在源代碼中Java線程控制權式如何體現的。當wait的時候其實就是已經放出了線程的控制權,所以one可以運行。one運行時調用notify后又喚醒了two線程所以打印順序才是:
wait
sleep
wake up
我覺得我解釋的已經很清楚了。wait被調用的時候放棄鎖,而控制線程是否能使用內容的關鍵就在于鎖,wait并不是thread的內容,而來自于object。你可以這樣來理解wait,我wait下就把接力棒交出去了,我當前的這個線程就暫停運行,記住是當前的線程。然后當我交出的接力棒已經又回到我手中的時候,也就是說其他的線程已經完成了任務。這個時候我拿到接力棒繼續奔跑。
有時候你應該把問題簡單化,建議你看看thinking in java第四版,我明白你是想觀察阻塞的出現,你可以將one。start放到two。start的上邊就會明白什么意思了
- 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();
- }
- }
- }
以上就是對Java線程控制權有關代碼的詳細介紹。
【編輯推薦】