1. 程式人生 > >java多執行緒之執行緒狀態(2)

java多執行緒之執行緒狀態(2)

轉載請註明出處

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

作者:小馬

來看suspend和resume機制造成的阻塞現象。需要明確一點,suspend和resume在jdk1.6以後就不推薦使用了。這裡只為了說明原理。


Blockable和Peeker依然是通用測試類,新增了兩個類,分別為SuspendResume1和SuspendResume2。與上一篇類似,兩個類的唯一區別在於run函式:

class SuspendResume1 extends SuspendResume
{
	public SuspendResume1(Container c) {super(c);}
	public synchronized void run()
	{
		while(true)
		{
			i++;
			update();
			suspend();
		}
	}
}
class SuspendResume2 extends SuspendResume
{
	public SuspendResume2(Container c)
	{
		super(c);
	}
	public void run()
	{
		while(true)
		{
			change();
			suspend();
		}
	}
	
	public synchronized void change()
	{
		i++;
		update();
	}
}

這裡不多說了,執行的效果如下:



SuspendResume2中的value才會和文字框裡的計數器同步。


兩個類通過suspend來讓自己阻塞,從而其它執行緒才有機會執行,不過這裡有些區別,不像sleep在睡眠一定時間會自動喚醒,suspend的執行緒必須要resume才能喚醒,這就是Resumer類的作用,它也是一個執行緒,每隔1s就讓SuspendResume例項喚醒自己。

class Resumer extends Thread
{
	private SuspendResume sr;
	public Resumer(SuspendResume sr)
	{
		this.sr = sr;
		start();
	}
	
	public void run()
	{
		while(true)
		{
			try 
			{
				sleep(1000);
			} 
			catch (InterruptedException e) 
			{
				// TODO: handle exception
				System.err.println("Interrupted");
			}
			sr.resume();
		}
	}
	
}