1. JDK 1.0版本中有一个stop方法用于强制中止线程,但是现在这个方法被废止。因此没有方法强制中止线程,但是interrupt方法可以要求某个线程的中止。

2. 某个线程的interrupt方法被调用后,该线程被设为中断状态,这是一个boolean值,每个线程都应当定期检查这个值,以知道自己是否被中断。一个线程被interrupt并不意味着它必须结束,仅仅是发送了一个消息而已。

3. Thread.currentThread().isInterrupted()方法返回一个boolean值,表示是否为中断状态。

4. 当某个线程阻滞时(如在sleep wait方法调用后),无法检查中断状态。如果此时interrupt方法被调用,当前的阻滞状态就会被中止,并且产生InterruptedException。

5. 一个run方法应当有这样的形式:
public void run() {
try {
//...
while (!Thread.currentThread().isInterrupted() && more work to do) {
//do more work
}
} catch (InterruptedException e) {
//...
}
finally {
//clean up, if required
}
}
如果在线程每个工作段后都使用sleep方法,就不必检查中断状态了,此时只要处理好InterruptedException就行了。

6. 还有一个类似的静态方法interrupted(),同样返回一个boolean值,不同的是该方法同时把当前中断状态设为了false。

7. 有一个很不好习惯:捕获InterruptedException后没有进行任何的处理。如果的确想不到什么事情做,至少可以加上Thread.currentThread().interrupted()改变中断状态,以便呼叫者知道这个情况;或者可以开头声明throws InterrupedException,并取消try块,让呼叫者处理这个问题。

8. 线程的四个状态:New, Runnable, Blocked, Dead
New状态:在new Thread(r)被调用后,start方法调用前。做一些初始化工作。
Runaable状态:start方法调用后。一个线程在运行并不意味着它在不停地运行,事实上,应当不时的中断,以便其他线程有机会运行。具体细节由操作系统决定。preemptive系统给每个线程一段时间运行,之后暂停该线程,给另一个线程运行的机会。选择另一个线程时,系统会考虑优先权。但是在cooperative系统中,只有在一个线程sleep或yield时才会交出控制权。
Blocked:以下几种情况会导致停滞:1)调用sleep方法 2)执行了某个在IO上阻塞的操作 3)试图获得正被其他线程控制的lock 4)waits for a conditionsee page 5)其他人调用了该线程的suspend方法,注意这个方法已被废止。
当一个线程从Blocked中恢复时(如sleep方法设定时间到,IO操作完成等),系统会根据优先级决定是否继续运行这个线程。
不能简单地调用线程的resume方法使之从Blocked状态中恢复。如果要取消因IO操作导致的block,可以让另一个线程关闭对应的IO通道(channel),则原来那个线程恢复运行,并抛出ClosedChannelException。
Death:run方法结束后线程就进入Death状态。也可以通过调用线程的stop方法中止该线程运行,会抛出ThreadDeath错误。当然,不要在你自己的代码里使用这个方法。
线程的isAlive()方法返回该线程是否已被中止(也有可能尚未运行)。


posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2.26 Java notes - Multithreading

Posted on 2007-04-22 20:25 ZelluX 阅读(238) 评论(0)  编辑  收藏 所属分类: OOP
2007-02-26 21:53:39
只有注册用户登录后才能发表评论。


网站导航: