当前位置:天才代写 > tutorial > JAVA 教程 > java中的锁池及期待池

java中的锁池及期待池

2017-11-02 08:00 星期四 所属: JAVA 教程 浏览:772

package com.tju;
class Target
{
	private int count;
	
	public synchronized void increase()
	{
		if(count == 2)
		{
			try
			{
				wait();
			} 
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		count++;
		System.out.println(Thread.currentThread().getName() + ":" + count);
		notify();
	}
	
	public synchronized void decrease()
	{
		if(count == 0)
		{
			try
			{
				//期待,由于Decrease线程挪用的该要领,
				//URL:http://www.bianceng.cn/Programming/Java/201608/50397.htm
				//所以Decrease线程进入工具t(main函数中实例化的)的期待池,而且释放工具t的锁
				wait();//Object类的要领
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		count--;
		System.out.println(Thread.currentThread().getName() + ":" + count);
		
		//叫醒线程Increase,Increase线程从期待池到锁池
		notify();
	}
}
class Increase extends Thread
{
	private Target t;
	
	public Increase(Target t)
	{
		this.t = t;
	}
	@Override
	public void run()
	{	
		for(int i = 0 ;i < 30; i++)
		{
			try
			{
				Thread.sleep((long)(Math.random()*500));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			
			t.increase();
		}
		
	}
	
}
class Decrease extends Thread
{
	
	private Target t;
	public Decrease(Target t)
	{
		this.t = t;
	}
	
	@Override
	public void run()
	{
		for(int i = 0 ; i < 30 ; i++)
		{
			try
			{
				//随机睡眠0~500毫秒
				//sleep要领的挪用,不会释放工具t的锁
				Thread.sleep((long)(Math.random()*500));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			
			t.decrease();
			
		}
		
	}
	
}

public class Test
{
	public static void main(String[] args)
	{
		Target t = new Target();
		
		Thread t1 = new Increase(t);
		t1.setName("Increase");
		Thread t2 = new Decrease(t);
		t2.setName("Decrease");
		
		t1.start();
		t2.start();
	}
}

 

    关键字:

天才代写-代写联系方式