程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java多線程語句具體分類的詳細介紹

Java多線程語句具體分類的詳細介紹

編輯:關於JAVA

在Java多線程語句中有很多的小的語句需要我們特殊的注意。 wait(),notify(),notifyAll()不屬於Thread類,下面我們就來詳細的看看如何使用這幾個分類代碼。希望大家有所收獲。

  而是屬於Object基礎類,也就是說每個對像都有wait(),notify(),notifyAll()的功能.因為都個對像都有鎖,鎖是每個對像的基礎,當然操作鎖的方法也是最基礎了.先看Java doc怎麼說:

  Java多線程語句中,wait導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權並等待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。然後該線程將等到重新獲得對監視器的所有權後才能繼續執行.

  notify喚醒在此對象監視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。此方法只應由作為此對象監視器的所有者的線程來調用.

  "當前的線程必須擁有此對象監視器"與"此方法只應由作為此對象監視器的所有者的線程來調用"說明wait方法與notify方法必須在同步塊內執行,即synchronized(obj之內).

  調用對像wait方法後,當前線程釋放對像鎖,進入等待狀態.直到其他線程(也只能是其他線程)通過notify 方法,或 notifyAll.該線程重新獲得對像鎖。繼續執行,記得線程必須重新獲得對像鎖才能繼續執行.因為synchronized代碼塊內沒有鎖是寸步不能走的.看一個很經典的例子:

  1.Code

  2.package ProductAndConsume;

  3.import Java.util.List;

  4.public class Consume implements Runnable{

  5.private List container = null;

  6.private int count;

  7.public Consume(List lst){

  8.this.container = lst;

  9.}

  10.public void run() {

  11.while(true){

  12.synchronized (container) {

  13.if(container.size()== 0){

  14.try {

  15.container.wait();//放棄鎖

  16.} catch (InterruptedException e) {

  17.e.printStackTrace();

  18.}

  19.}

  20.try {

  21.Thread.sleep(100);

  22.} catch (InterruptedException e) {

  23.// TODO Auto-generated catch block

  24.e.printStackTrace();

  25.}

  26.container.remove(0);

  27.container.notify();

  28.System.out.println("我吃了"+(++count)+"個");

  29.}

  30.}

  31.}

  32.}

  33.package ProductAndConsume;

  34.import Java.util.List;

  35.public class Product implements Runnable {

  36.private List container = null;

  37.private int count;

  38.public Product(List lst) {

  39.this.container = lst;

  40.}

  41.public void run() {

  42.while (true) {

  43.synchronized (container) {

  44.if (container.size() > MultiThread.MAX) {

  45.try {

  46.container.wait();

  47.} catch (InterruptedException e) {

  48.e.printStackTrace();

  49.}

  50.}

  51.try {

  52.Thread.sleep(100);

  53.} catch (InterruptedException e) {

  54.e.printStackTrace();

  55.}

  56.container.add(new Object());

  57.container.notify();

  58.System.out.println("我生產了"+(++count)+"個");

  59.}

  60.}

  61.}

  62.}

  63.package ProductAndConsume;

  64.imort Java.util.ArrayList;

  65.import Java.util.List;

  66.public class MultiThread {

  67.private List container = new ArrayList();

  68.public final static int MAX = 5;

  69.public static void main(String args[]){

  70.MultiThread m = new MultiThread();

  71.new Thread(new Consume(m.getContainer())).start();

  72.new Thread(new Product(m.getContainer())).start();

  73.new Thread(new Consume(m.getContainer())).start();

  74.new Thread(new Product(m.getContainer())).start();

  75.}

  76.public List getContainer() {

  77.return container;

  78.}

  79.public void setContainer(List container) {

  80.this.container = container;

  81.}

  以上就是對Java多線程語句的詳細介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved