標籤:style blog http color java 使用 os io
關於Object類中的線程方法
Object類是所有Java類的 父類,在該類中定義了三個與線程操作有關的方法,使得所有的Java類在建立之後就支援多線程
這三個方法是:notify(),notifyAll(),wait(),這幾個方法都是用來控制線程的運行狀態的。
方法列表如下:
notify() : 喚醒在此對象監視器上等待的單個線程
notifyAll() : 喚醒在此對象監視器上等待的所有線程
wait() : 在其他線程時調用此對象的notify()或者notifyAll()方法前,導致當前線程等待
wait(long timeout) : 在notify()或者notifyAll()方法被調用之前或者超過指定的時間之前,導致當前線程等待
wait(long timeout,int nanos) : 在notify()或者notifyAll()方法被調用之前或者超過指定的時間之前,
或者其他線程中斷當前線程之前,導致當前線程等待。
--如果朋友您想轉載本文章請註明轉載地址"http://www.cnblogs.com/XHJT/p/3905372.html "謝謝--
注意: 在Object類中,以上所有的方法都是final的,切記勿與Thread類混淆
且這幾個方法要與Synchronized關鍵字一起使用,他們都是與對象監視器有關的,
當前線程必須擁有此對象的監視器,否則會出現IllegalMonitorStateException異常。
代碼執行個體:
package com.xhj.thread;import java.util.Random;/** * Object類中與線程相關方法的應用 * * @author XIEHEJUN * */public class ObjectThreadMethod { /** * 定義商品最高件數 */ private int count = 10; /** * 生產時記錄倉庫商品件數 */ private int sum = 0; private class Producter implements Runnable { @Override public void run() { for (int i = 0; i < count; i++) { int num = new Random().nextInt(255); synchronized (this) { if (sum == count) { System.out.println("倉庫已滿"); try { this.wait(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("生產商品" + num + "號"); this.notify(); sum++; System.out.println("倉庫還有商品" + sum + "件"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } private class Consomer implements Runnable { @Override public void run() { for (int i = 0; i < count; i++) { synchronized (this) { if (sum == 0) { System.out.println("倉庫已經為空白,請補貨"); try { this.wait(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("消費著買去了一件商品"); this.notify(); sum--; System.out.println("倉庫還有商品" + sum + "件"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } /** * 調用線程服務 */ public void service() { Producter productor = new Producter(); Consomer consomer = new Consomer(); Thread thread1 = new Thread(productor); Thread thread2 = new Thread(consomer); thread1.start(); thread2.start(); } public static void main(String[] args) { // TODO Auto-generated method stub ObjectThreadMethod ob = new ObjectThreadMethod(); ob.service(); }}