科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件基于JDK5.0的一些Thread总结(2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

3.线程状态 New:当使用new创建一个线程时 Runnable: 调用start或是从blocked状态出来时

作者:中国IT实验室 来源:中国IT实验室 2007年8月22日

关键字: JDK5 Thread

  • 评论
  • 分享微博
  • 分享邮件
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();


查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章