java多线程之线程状态(3)

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/43247307


作者:小马


本篇是wait和notify方式的线程阻塞示例,



与前面几种方法不同的是,wait()与notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){...}语句块内。
 
wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠,而notify是让调用它的线程对象唤醒(当然是在其它线程里调用的)。


先看代码,还是两个类,

//wait and nofity
class WaitNotify1 extends Blockable
{
	public WaitNotify1(Container c)
	{
		super(c);
	}
	
	public synchronized void run()
	{
		while(true)
		{
			i++;
			update();
			try 
			{
				wait(100);
			} 
			catch (InterruptedException e) {
				System.err.println("interrupted");
			}
		}
	}
}

class WaitNotify2 extends Blockable
{
	public WaitNotify2(Container c)
	{
		super(c);
		new Notifier(this);
	}
	public synchronized void run()
	{
		while(true)
		{
			i++;
			update();
			try 
			{
				wait();
			} 
			catch (InterruptedException e) 
			{
				System.err.println("interrupted");
			}
		}
	}
}

class Notifier extends Thread
{
	private WaitNotify2 wn2;
	public Notifier(WaitNotify2 wn2)
	{
		this.wn2 = wn2;
		start();
	}
	
	public void run()
	{
		while(true)
		{
			try 
			{
				sleep(2000);
			} 
			catch (InterruptedException e) 
			{
				System.err.println("interrupted");
			}
			synchronized (wn2) 
			{
				wn2.notify();
			}
		}
	}
}




类1和类2的主要区别在于, 类2有一个notifer对象能每隔2s唤醒它一次,因为类2休眠调用的是不带参数的wait,这种只能被主动唤醒。


运行的效果如下:

java多线程之线程状态(3)_第1张图片

你可能感兴趣的:(java,thread,线程,notify,wati)