java多線程學習(四)——線程的互動,java多線程線程

來源:互聯網
上載者:User

java多線程學習(四)——線程的互動,java多線程線程

線程互動中用到的三個基本函數:

void notify();喚醒在此對象監視器上等待的單個線程。

void notifyAll();喚醒在此對象監視器上等待的所有線程。

void wait();導致當前的線程等待,直到其他線程調用此對象的notify()或者notifyAll()方法。

void wait(long timeout);wait()的重載版本,同樣導致當前線程等待,直到其他線程調用此對象的notify()或者notifyAll()方法,或者等待超過指定的時間後不再等待。

void wait(long timeout,int nanos);wait()的重載版本,同樣導致當前線程等待,直到其他線程調用此對象的notify()或者notifyAll()方法,或者等待超過某個實際的時間後不再等待,或者其他某個線程中斷當前線程。

線上程互動中需要注意的是:

wait()、notify()、notifyAll()方法必須從同步環境中調用,線程不能調用對象上等待或通知的方法,除非此線程擁有對象的鎖。

線程通過執行對象上的wait()方法獲得等待列表,此後線程不再執行任何其他指令,直到調用對象的notify()方法為止。當多個線程在同一個對象上等待的時候,則notify()將隨機的喚醒其中的一個線程來使其運行。若沒有線程等待,則不做任何處理。

要執行wait()方法,前提是當前線程擁有此對象的鎖,當執行wait()方法之後,此線程即釋放此對象的鎖,以便於其他線程中調用notify()或者notifyAll()來喚醒此線程。然而調用notify()時,不意味著線程會釋放對象的鎖。如果線程依然在完成同步代碼,那麼線程在完成同步代碼塊時不會釋放對象的鎖。所以,notify()並不意味著鎖變得可用。


注意的問題:

wait(),notify(),notifyAll()不屬於Thread類,而屬於Object類,也就是說每個對象都有著三個方法。因為每個對象都有自己的鎖,鎖是每個對象的基礎,操作鎖的方法也是每個對象的基礎。

wait()導致的是當前的線程的等待,而不是調用對象所在的線程類等待,也就是哪個線程擁有此對象的鎖才能調用wait()方法。

notify()喚醒當前對象監視器上等待的單個線程,如果在此對象上有多個線程在等待,則隨機的喚醒期中一個線程,直到當前線程放棄此對象上的鎖,才能繼續執行被喚醒的線程。notify()也和wait()一樣,必須由持有此對象的鎖的線程來調用,notifyAll()也一樣,但是notifyAll()會喚醒在這個對象等待的所有線程,並從這個線程中隨機的選擇一個。

這三個方法都需要和synchronized配合使用,也就是必須先擷取對象的鎖,才能調用者三個方法。



在一個JAVA多線程程式中,在什情況下將會調用線程的yield()方法?

來自:開發人員線上
Java多線程程式設計詳細解析

一、理解多線程

多線程是這樣一種機制,它允許在程式中並發執行多個指令流,每個指令流都稱為一個線程,彼此間互相獨立。

線程又稱為輕量級進程,它和進程一樣擁有獨立的執行控制,由作業系統負責調度,區別在於線程沒有獨立的儲存空間,而是和所屬進程中的其它線程共用一個儲存空間,這使得線程間的通訊遠較進程簡單。

多個線程的執行是並發的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”。如果系統只有一個CPU,那麼真正的“同時”是不可能的,但是由於CPU的速度非常快,使用者感覺不到其中的區別,因此我們也不用關心它,只需要設想各個線程是同時執行即可。

多線程和傳統的單線程在程式設計上最大的區別在於,由於各個線程的控制流程彼此獨立,使得各個線程之間的代碼是亂序執行的,由此帶來的線程調度,同步等問題,將在以後探討。

二:在Java中實現多線程

我們不妨設想,為了建立一個新的線程,我們需要做些什嗎?很顯然,我們必須指明這個線程所要執行的代碼,而這就是在Java中實現多線程我們所需要做的一切!

真是神奇!Java是如何做到這一點的?通過類!作為一個完全物件導向的語言,Java提供了類java.lang.Thread來方便多線程編程,這個類提供了大量的方法來方便我們控制自己的各個線程,我們以後的討論都將圍繞這個類進行。

那麼如何提供給 Java 我們要線程執行的代碼呢?讓我們來看一看 Thread 類。Thread 類最重要的方法是run(),它為Thread類的方法start()所調用,提供我們的線程所要執行的代碼。為了指定我們自己的代碼,只需要覆蓋它!

方法一:繼承 Thread 類,覆蓋方法 run(),我們在建立的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。下面是一個例子:

public class MyThread extends Thread
{
int count= 1, number;
public MyThread(int num)
{
number = num;
System.out.println
("建立線程 " + number);
}
public void run() {
while(true) {
System.out.println
("線程 " + number + ":計數 " + count);
if(++count== 6) return;
}
}
public static void main(String args[])
{
for(int i = 0;
i 〈 5; i++) new MyThread(i+1).start();
}
}

這種方法簡單明了,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程式必須繼承自 Applet 類),則無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應該怎麼辦呢?

我們不妨來探索一種新的方法:我們不建立Thread類的子類,而是直接使用它,那麼我們只能將我們的方法作為參數傳遞給 Thread 類的執行個體,有點類似回呼函數。但是 Java 沒有指標,我們只能傳遞一個包含這個方法的類的執行個體。

那麼如何限制這個類必須包含這一方法呢?當然是使用介面!(雖然抽象類別也可滿足,但是需要繼承,而我們之......餘下全文>>
 
用JAVA寫一個多線程程式,寫四個線程,其中二個對一個變數加1,另外二個對一個變數減1,輸出

我們不妨設想,為了建立一個新的線程,我們需要做些什嗎?很顯然,我們必須指明這個線程所要執行的代碼,而這就是在Java中實現多線程我們所需要做的一切!

真是神奇!Java是如何做到這一點的?通過類!作為一個完全物件導向的語言,Java提供了類 java.lang.Thread 來方便多線程編程,這個類提供了大量的方法來方便我們控制自己的各個線程,我們以後的討論都將圍繞這個類進行。

那麼如何提供給 Java 我們要線程執行的代碼呢?讓我們來看一看 Thread 類。Thread 類最重要的方法是 run() ,它為Thread 類的方法 start() 所調用,提供我們的線程所要執行的代碼。為了指定我們自己的代碼,只需要覆蓋它!

方法一:繼承 Thread 類,覆蓋方法 run(),我們在建立的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。下面是一個例子:

public class MyThread extends Thread {

int count= 1, number;

public MyThread(int num) {

number = num;

System.out.println("建立線程 " + number);

}

public void run() {

while(true) {

System.out.println("線程 " + number + ":計數 " + count);

if(++count== 6) return;

}

}

public static void main(String args[]) {

for(int i = 0; i 〈 5; i++) new MyThread(i+1).start();

}

}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.