• 多线程的等待唤醒(使用监视器)


    /*
    在jdk1.5版本之后,
    出现了一些新的特性,将原理的线程进行了改良。
    
    在java.util.concurrent.locks包中提供了一个接口Lock。替代了synchronized。
    
    synchronized。使用的是锁操作是隐式的。
    
    Lock接口,使用的锁操作是显示的。
    由两个方法来完成:
    lock():获取锁。
    unlock():释放锁。
    
    
    还有一个对象,Condition.
    该对象的出现替代了Object中的wait notify notifyAll这些操作监视器的方法。
    
    替代后的方式:await  signal  signalAll.
    
    
    
    
    
    接下来,把下列代码替换成JDK1.5版本只有的新对象。
    
    
    
    新功能最大好处,就是在一个Lock锁上,可以添加多组监视器对象。
    
    这样就可以实现本方只唤醒对方的线程
    
    
    
    锁,是同步的机制.通过锁来控制同步.监视器是用于同步中对象的操作.
    比如wait,notify  notifyAll.每一组监视器方法对应一个锁.
    到了jdk1.5以后,将监视器的方式从Object中,封装到了Condition对象中,
    每一个锁lock,可以对应多组监视器对象,这就可以实现本方只唤醒对方的操作。
    
    
    */
    import java.util.concurrent.locks.*;
    class Res
    {
    	private String name;
    	private int count  = 0;
    	private boolean b = false;
    
    	//定义一个锁。
    	Lock lock = new ReentrantLock();
    
    	//通过指定的锁,创建了一个该锁上可以使用了监视器对象。
    	Condition proCon = lock.newCondition();
    
    	//升级后的lock可以对应多组监视器对象。
    	Condition cusCon = lock.newCondition();
    
    
    	public void set(String name)
    	{
    		//获取锁。
    		lock.lock();
    		try
    		{	
    			while(b)
    				proCon.await();
    			this.name = name+"--------"+count;
    			count++;
    			System.out.println(Thread.currentThread().getName()+".....生产者...."+this.name);
    			b = true;
    			cusCon.signal();
    		}
    		catch(InterruptedException e)
    		{
    		
    		}
    		finally
    		{
    			//释放锁
    			lock.unlock();
    		}
    
    
    	}
    
    
    	public void out()
    	{
    		lock.lock();
    		try
    		{
    			while(!b)
    				cusCon.await();
    			System.out.println(Thread.currentThread().getName()+"----消费者---"+this.name);
    			b = false;
    			proCon.signal();
    
    		}
    		catch (InterruptedException e)
    		{
    		}
    		finally
    		{
    			lock.unlock();
    		}
    	}
    	
    }
    
    
    class Pro implements Runnable
    {
    	private Res r;
    	Pro(Res r)
    	{
    		this.r = r;
    	}
    	public void run()
    	{
    		while(true)
    		{
    			r.set("产品");
    		}
    	}
    }
    class Cus implements Runnable
    {
    	private Res r;
    	Cus(Res r)
    	{
    		this.r = r;
    	}
    	public void run()
    	{
    		while(true)
    		{
    			r.out();
    		}
    	}
    }
    
    
    
    class ProCusDemo2 
    {
    	public static void main(String[] args) 
    	{
    		Res r = new Res();
    		Pro p = new Pro(r);
    		Cus c = new Cus(r);
    
    		Thread t1 = new Thread(p);
    		Thread t2 = new Thread(p);
    		Thread t3 = new Thread(c);
    		Thread t4 = new Thread(c);
    		//t1,t2都是生产者。
    		//t3,t4都是消费者。
    		t1.start();
    		t2.start();
    		t3.start();
    		t4.start();
    	}
    }
    

      

  • 相关阅读:
    课后作业03-以淘宝网为例从质量的六个属性描述分析
    软件体系架构课后作业02-架构漫谈阅读笔记
    java中怎样跳出当前的多层循环嵌套
    redis二级缓存的五种数据类型的常用命令
    递归算法 菲波那切数列 (一个楼梯有n阶,每一次可以走一个台阶或者二个台阶请问总共有几种走法)
    restful代码风格
    java开发工程师面试题总结(适用于1-2年工作经验的人)
    Java中HashMap与HashTable的联系与区别
    HashMap扩容因子默认是0.75?底层数据结构? hash函数处理冲突的集中方式?
    设计模式
  • 原文地址:https://www.cnblogs.com/liushisaonian/p/8595376.html
Copyright © 2020-2023  润新知