Java要点和《疯狂Java讲义》例程整理(三)

2014-11-24 03:26:37 · 作者: · 浏览: 5
略的 系统中,当系统给线程的时间片用完之后,系统就会剥夺线程所占的资源,该线程进入阻塞状态,而在小型设备中系统可能采用协作式的调度策略,这时只有当一个线程调用了它的sleep()或yield()方法后才会放弃所占用的资源。死亡状态,线程会以如下3种方式结束,结束后就出于死亡状态。run()或call()方法执行完成,线程抛出一个未捕获的Exception或Error,直接调用线程的stop()方法来结束该线程

join方法

当某个程序执行流中调用其他线程的join方法时,调用线程将被阻塞,直到被join()方法加入的线程执行完为止。

后台线程

后台线程(Deamon Thread)的任务是为其他的线程提供服务,如果所有的前台线程都死亡了,后台线程自动死亡。 调用Thread对象的setDaemon(true)方法可将指定线程设置成后台线程。

yield方法

让线程从运行状态转到就绪状态。

线程同步

使用同步代码块,语法格式如下
synchronized(obj)
{
	// Codes need thread safety
}

obj称为同步监视器

同步方法
public synchronized void draw()
{
	// Codes need thread safety
}

同步方法的同步监视器是this

嵌套的同步块是安全的,如
synchronized(a)
{
	synchronized(a)
	{
	// Codes need thread safety
	}
}

同步锁

Lock对象
class X
{
	private final ReentrantLock lock = new ReentrantLock();
	
	public void m()
	{
		lock.lock();
		try{
			// Codes need thread safety
		}
		finally
		{
			lock.unlock();
		}
	}
}
ReentrantLock锁具有可重入性,线程可以对它已加锁的ReentrantLock再次加锁。lock()加锁之后必须显示调用unlock()释放锁,所以一段被锁保护的代码可以调用被相同锁保护的方法。

线程通信

进程调用wait()阻塞自己,知道被notify()或notifyAll()唤醒。