略的
系统中,当系统给线程的时间片用完之后,系统就会剥夺线程所占的资源,该线程进入阻塞状态,而在小型设备中系统可能采用协作式的调度策略,这时只有当一个线程调用了它的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()唤醒。