麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

java多線程之wait(),notify(),notifyAll()的詳解分析

2019-11-26 16:04:17
字體:
供稿:網(wǎng)友
wait(),notify(),notifyAll()不屬于Thread類,而是屬于Object基礎(chǔ)類,也就是說每個對象都有wait(),notify(),notifyAll()的功能.因為每個對象都有鎖,鎖是每個對象的基礎(chǔ),當然操作鎖的方法也是最基礎(chǔ)了。

wait導致當前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或被其他線程中斷。wait只能由持有對像鎖的線程來調(diào)用。

notify喚醒在此對象監(jiān)視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程(隨機)。直到當前的線程放棄此對象上的鎖,才能繼續(xù)執(zhí)行被喚醒的線程。同Wait方法一樣,notify只能由持有對像鎖的線程來調(diào)用.notifyall也一樣,不同的是notifyall會喚配所有在此對象鎖上等待的線程。
"只能由持有對像鎖的線程來調(diào)用"說明wait方法與notify方法必須在同步塊內(nèi)執(zhí)行,即synchronized(obj)之內(nèi).再者synchronized代碼塊內(nèi)沒有鎖是寸步不行的,所以線程要繼續(xù)執(zhí)行必須獲得鎖。相輔相成。
看一個很經(jīng)典的例子(生產(chǎn)者與消費者):
首先是消費者線程類:
復制代碼 代碼如下:

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();// 容器為空,放棄鎖,等待生產(chǎn)
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    container.remove(0);
    container.notify();
    System.out.println("我吃了" + (++count) + "個");
   }
  }
 }
}

接下來是生產(chǎn)者線程類:
復制代碼 代碼如下:

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) {
     // 如果容器超過了最大值,就不要在生產(chǎn)了,等待消費
     try {
      container.wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    container.add(new Object());
    container.notify();
    System.out.println("我生產(chǎn)了" + (++count) + "個");
   }
  }
 }
}

最后是測試類:
復制代碼 代碼如下:

import 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();
 }
 public List getContainer() {
  return container;
 }
 public void setContainer(List container) {
  this.container = container;
 }
}

運行結(jié)果如下所示:
復制代碼 代碼如下:

我生產(chǎn)了1個
我吃了1個
我生產(chǎn)了2個
我生產(chǎn)了3個
我生產(chǎn)了4個
我生產(chǎn)了5個
我生產(chǎn)了6個
我生產(chǎn)了7個
我吃了2個
我生產(chǎn)了8個
我吃了3個
我生產(chǎn)了9個
我吃了4個
我吃了5個
我吃了6個
我吃了7個
我吃了8個
我生產(chǎn)了10個
我生產(chǎn)了11個
我吃了9個
我生產(chǎn)了12個
我吃了10個
......

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久噜噜噜精品国产亚洲综合 | 国产色片在线观看 | 91精品免费观看 | 欧洲a级片 | 精品国产一区二区亚洲人成毛片 | 日本黄色大片免费 | 欧美成人综合视频 | 成人超碰97| 牛牛碰在线| 欧美精品| 欧美性受xxx黑人xyx性爽 | 看免费5xxaaa毛片 | 欧美成人黄色小视频 | 久久爽精品区穿丝袜 | 欧美日韩一区二区综合 | 久久国产中文 | 蜜桃视频在线免费播放 | 成人h视频在线 | 国产精品久久久久网站 | 九九热欧美 | 久久久久久久亚洲视频 | 国产一区二区免费在线观看视频 | 亚州精品在线视频 | 黄色免费大片 | 国产人成免费爽爽爽视频 | av电影在线网站 | 久久国产精品99国产 | 国产羞羞网站 | 国产1区2 | 依依成人综合 | jj视频在线播放 | 国产又粗又爽又深的免费视频 | 免费毛片播放 | 操碰在线视频 | 日本欧美国产 | 久久亚洲视频网 | 午夜国产精品成人 | 国产91亚洲精品久久久 | 91精品国产日韩91久久久久久360 | 毛片免费观看视频 | 国产超碰人人做人人爱ⅴa 国产精品久久久久久久hd |