Java多線程語句具體分類的詳細介紹
在Java多線程語句中有很多的小的語句需要我們特殊的注意。wait(),notify(),notifyAll()不屬于Thread類,下面我們就來詳細的看看如何使用這幾個分類代碼。希望大家有所收獲。
而是屬于Object基礎(chǔ)類,也就是說每個對像都有wait(),notify(),notifyAll()的功能.因為都個對像都有鎖,鎖是每個對像的基礎(chǔ),當然操作鎖的方法也是最基礎(chǔ)了.先看java doc怎么說:
Java多線程語句中,wait導(dǎo)致當前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法。當前的線程必須擁有此對象監(jiān)視器。該線程發(fā)布對此監(jiān)視器的所有權(quán)并等待,直到其他線程通過調(diào)用 notify 方法,或 notifyAll 方法通知在此對象的監(jiān)視器上等待的線程醒來。然后該線程將等到重新獲得對監(jiān)視器的所有權(quán)后才能繼續(xù)執(zhí)行.
notify喚醒在此對象監(jiān)視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。直到當前的線程放棄此對象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。此方法只應(yīng)由作為此對象監(jiān)視器的所有者的線程來調(diào)用.
"當前的線程必須擁有此對象監(jiān)視器"與"此方法只應(yīng)由作為此對象監(jiān)視器的所有者的線程來調(diào)用"說明wait方法與notify方法必須在同步塊內(nèi)執(zhí)行,即synchronized(obj之內(nèi)).
調(diào)用對像wait方法后,當前線程釋放對像鎖,進入等待狀態(tài).直到其他線程(也只能是其他線程)通過notify 方法,或 notifyAll.該線程重新獲得對像鎖。繼續(xù)執(zhí)行,記得線程必須重新獲得對像鎖才能繼續(xù)執(zhí)行.因為synchronized代碼塊內(nèi)沒有鎖是寸步不能走的.看一個很經(jīng)典的例子:
- Code
 - package ProductAndConsume;
 - import java.util.List;
 - public class Consume implements Runnable{
 - private List container = null;
 - private int count;
 - public Consume(List lst){
 - this.container = lst;
 - }
 - public void run() {
 - while(true){
 - synchronized (container) {
 - if(container.size()== 0){
 - try {
 - container.wait();//放棄鎖
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - }
 - try {
 - Thread.sleep(100);
 - } catch (InterruptedException e) {
 - // TODO Auto-generated catch block
 - e.printStackTrace();
 - }
 - container.remove(0);
 - container.notify();
 - System.out.println("我吃了"+(++count)+"個");
 - }
 - }
 - }
 - }
 - package ProductAndConsume;
 - import java.util.List;
 - public class Product implements Runnable {
 - private List container = null;
 - private int count;
 - public Product(List lst) {
 - this.container = lst;
 - }
 - public void run() {
 - while (true) {
 - synchronized (container) {
 - if (container.size() > MultiThread.MAX) {
 - try {
 - container.wait();
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - }
 - try {
 - Thread.sleep(100);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - container.add(new Object());
 - container.notify();
 - System.out.println("我生產(chǎn)了"+(++count)+"個");
 - }
 - }
 - }
 - }
 - package ProductAndConsume;
 - imort java.util.ArrayList;
 - import java.util.List;
 - public class MultiThread {
 - private List container = new ArrayList();
 - public final static int MAX = 5;
 - public static void main(String args[]){
 - MultiThread m = new MultiThread();
 - new Thread(new Consume(m.getContainer())).start();
 - new Thread(new Product(m.getContainer())).start();
 - new Thread(new Consume(m.getContainer())).start();
 - new Thread(new Product(m.getContainer())).start();
 - }
 - public List getContainer() {
 - return container;
 - }
 - public void setContainer(List container) {
 - this.container = container;
 - }
 
以上就是對Java多線程語句的詳細介紹。
【編輯推薦】















 
 
 


 
 
 
 