信息化
新闻日历
图片新闻
Meat Card:饿了就吃点你的名片吧(图)
你的名片够特别吗?可以吃吗?Meat Cards是100%的牛肉...
2009/05/31
Q-Sound太阳能蓝牙耳机 你准备好迎接了吗(图)
所有为了环保节能尽份心力的产品都都值得嘉许,更何况...
2009/05/31
科学家将公布证明黑洞存在照片 揭秘神秘阴影(图)
美国一个研究小组日前表示,他们有望在未来几个月公布...
2009/05/31
地球磁气圈是"汪洋大盗" 偷走大气层气体
科学家通常认为对地球具有防护屏作用的磁气圈能够保护...
2009/05/31
分析评论
惠普让计算器在iPhone、Windows重生(图)
这项要价14.99美元的应用程序还可搭配一个29.99美元的...
2009/06/30
投资者看好没有乔布斯的苹果
自苹果CEO史蒂夫-乔布斯休病假以来,苹果股价已经上涨...
2009/06/22

基于JDK5.0的一些Thread总结(2)




作者: 中国IT实验室
CNETNews.com.cn
2007-08-23 13:55:54

3.线程状态

New:当使用new创建一个线程时
Runnable: 调用start或是从blocked状态出来时
Blocked:sleep, block on input/output, try to acquire lock, suspend, wait.
Dead: 运行完成或有exception产生。

4.线程优先级

 可以设置线程优先级,但是不能保证高优先级的线程就会被先运行

5.线程组

 可以把多个线程加到一个线程组里面去,这样可以对这些线程进行一些统一的操作,例如
ThreadGroup g = new ThreadGroup(groupName)
...
g.interrupt(); // interrupt all threads in group g

6.为Uncaught Exceptions设置Handlers

 在java 5.0中,可以为线程中产生的unchecked exception设置一个处理器,这个处理器必须实现UncaughtExceptionHandler接口。
 可以调用线程实例的setUncaughtExceptionHandler方法为每个线程设置一个处理器,也可以调用Thread.setDefaultUncaughtExceptionHandler来为所有的线程设置一个默认的处理器。如果没有给每一个线程设置处理器,那线程会首先使用线程组的处理器,如果还没有再使用默认的处理器。

7.Synchronization

 多线程很重要的一个问题就是同步的问题,如果不解决好同步的问题一个是可能会引起数据的混乱,而且还有可能造成线程的死锁。在Java 5.0之前,用synchronized来解决这个问题,在5.0中加入了一个新的类:ReentrantLock

使用lock的基本形式是:

 myLock.lock(); // a ReentrantLock object
try
{
critical section
}
finally
{
myLock.unlock(); // make sure the lock is unlocked even if an exception is thrown
}


 这个锁被称为Reentrant的原因是在一个线程中可以重复多次申请同一个锁,系统会保留加锁的次数,而在解锁的时候也就必须执行相同次数。

 在一个线程已经得到锁可以执行程序的时候,可能会发现需要的条件还不能满足,这时他就必须等待直到条件满足。但是因为它已经对所需要操作的东西加了锁,其他的线程不能访问,因此它又可能会永远等待下去。现在可以用Condition Object来避免这种情况。

sufficientFunds = bankLock.newCondition();

如果条件不满足:

sufficientFunds.await();

 这时线程就会释放锁并进入blocked状态,其他线程就有机会执行操作。当其他线程执行完后,就可通知等待的线程继续执行它的操作了:

sufficientFunds.signalAll();

 当然也可以调用singal方法,这样效率会高一些,但是有一定的危险性,因为它的唤醒具有随机性。

 在5.0之前,采用的是synchronized关键字来进行同步,但是和lock相比它有一些局限性:

1. 申请锁的线程不能被interrupt
2. 没有timeout设置
3. 只有一个隐性的condition条件

 另外,在申请锁的时候可以用tryLock方法,它会返回一个bool值来表示锁是否申请成功,如果没有成功,程序就可以做其他的事情了。

 tryLock, await方法都可以被interrupt。

 java.util.concurrent.locks包中提供了两种锁,一个就是ReentrantLock,另一个是ReentrantReadWriteLock,一般用于多操作远远多于写操作的时候:

private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();


查看本文来源

[an error occurred while processing this directive]
发表您的观点
   姓名:(必填)


   电子邮件:


   验证码:(必填)
 

   正文:(必填)