JAVA线程 wait,nodify理解测试

下面我们通过一个例子来理解和学习关于JAVA线程 wait() nodify()。

先说说例子的整体思路和角色介绍,有一个仓库里面装着产品,有专门管销售的,有专门管生产的。

生产的和销售的都对应这个仓库,生产部的生产出一件产品就往仓库仍一件,销售的需要产品了,就直接上仓库拿去。

当销售部的去仓库拿货发现没有货了,就通知销售部门的人,都别来拿货了(wait()),当生产部生产出一定量的产品后

通知销售的,有货了去拿货吧(nodify())。然后就这样一直反复的生产和销售着。

好了,事情的来龙去脉已经搞清楚了。

这件事情有3个角色,仓库,销售部,生产部。下面来看代码吧。

仓库类

package thread;

/**
 * 仓库类
 */
public class ArrayBuffer {
	
	// 产品的数量
	public int pnum=0;
    
    /**
     * 增加产品数量
     * @param value
     * @throws InterruptedException
     */
    public synchronized void put(int value)throws InterruptedException{
    	System.out.println("生产了一件产品 当前库存:" + ++pnum);
    }
    
    /**
     * 减少产品数量
     * @return
     * @throws InterruptedException
     */
    public synchronized int get() throws InterruptedException{
    	
        if(pnum==0){
        	System.out.println("没有货了,停止销售。");
           wait();
           return 0;
        }
        
       this.notify();
       System.out.print("正在销售了一件产品");
       System.out.println("销售了一件产品...当前库存:" + --pnum);
       return 1;
    }

}

 生产类

package thread;

/**
 * 生产类
 */
public class Producer extends Thread{
	
    private ArrayBuffer c;
    public Producer(ArrayBuffer cc){
        this.c=cc;
    }
    
    public void run() {
        int i;
        for(i=0;true;i++){
            try {
            	Thread.sleep(500); //生产速度
                c.put(i);
             if(c.pnum >= 20) //货源到达一定数时 通知开始销售
                synchronized (c) {
                	c.notify();
                }
              
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
      
    }

}

 

销售类

package thread;

/**
 * 销售类
 */
public class Consumer extends Thread{
	
    private ArrayBuffer c;
    
    public Consumer(ArrayBuffer cc){
        this.c=cc;
       
    }
    
    public void run(){
        int i;
        for(i=0;true;i++){
            try {
            	
            	Thread.sleep(300); //销售速度
            	c.get();
            	
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

 

主的运行类,启动这套业务。

package thread;

/**
 * @author Administrator
 * wait , nodify方法的 理解测试。 一个生产和销售的例子
 * 销售线程 发现库存没货时 使用wait方法 将锁释放,这时候生产线程独立运行,当生产数达到20
 * 后,使用nodify方法 唤醒销售线程继续销售。
 */
public class MyPcTest {
	public static void main(String args[]) throws InterruptedException {
        ArrayBuffer c=new ArrayBuffer();
        Producer p=new Producer(c);
        p.setName("生产");
        Consumer consumer=new Consumer(c);
        consumer.setName("销售");
        p.start();
        consumer.start();
       
    }
}

 

你可能感兴趣的:(Java)