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

Posted 流世幻羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的等待唤醒(使用监视器)相关的知识,希望对你有一定的参考价值。

/*
在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();
	}
}

  

以上是关于多线程的等待唤醒(使用监视器)的主要内容,如果未能解决你的问题,请参考以下文章

Java线程的等待与唤醒

Java多线程虚假唤醒问题

买卖包子案例——等待唤醒机制

java面试基础问题积累----多线程,并发

java 多线程-生产者消费者模式-管程法

Java多线程_wait/notify/notifyAll方法