Java 编程下线程的生命周期

来源:互联网 发布:建表sql语句 编辑:程序博客网 时间:2024/04/28 15:04

线程的 4 个主要周期状态为创建线程、可执行(Runnable)、非可执行、终止(Dead)。当实例化一个 Thread 并执行 start() 之后,线程进入 Runnable 状态并开始执行 run() 方法。虽然线程看起来像是同时执行,但事实上在同一时间点上,还是只有一个线程在动作,只是线程之间切换的动作很快,所以看起来像是同时执行。

线程尤其优先权,由 1 (Thread.MIN_PRIORITY)到 10 (Thread.MAX_PRIORITY),默认是 5 (Thread.NORM_PRIORITY)。可以使用 Thread 的 setPriority() 方法来设定线程的优先权,设定必须在 1 到 10 之间,否则会抛出 IllegalArgumentException。优先权高的线程会先被执行完毕,然后才会轮到优先权低的线程。如果优先权相同,则轮流执行(Round-Robin 方式)。

绝大多数的操作系统都支持 Timeslicing,简单地说就是操作系统会为每一个线程分配一小段 CPU 时间(Quantum),时间一到就换下一个线程,即使现有的线程还没有结束。对于不支持 Timeslicing 的操作系统,每一个线程必须完成后,才能轮到下一个线程。在这样的操作系统中,如果想要让目前线程礼让一下其他线程,让它们有机会获得执行权,可以调用线程执行的 yield() 方法。例如:


public class SomeClass {    Thread thread = new Thread(new Runnable() {        public void run() {            while (true) {                yield(); // 暂时让出执行权            }        }    });    thread.start();}

yield() 方法让同样优先权的线程有被执行的机会,当线程执行 yield() 方法让出执行权时,它会再度加入线程的队列,等待再度取得执行权。对于支持 Timeslicing 的操作系统,不需要调用 yield() 方法,因为操作系统会自动分配时间给线程来轮流执行。

有几种状况会让线程进入 Not Runnable 状态(或是 blocked 状态):

  • 调用 sleep() 方法
  • 调用 wait() 方法
  • 等待输入/输出完成

当线程在 Not Runnable 状态时,表示有某些原因组织它执行(例如等待使用者的文字输入、倾听网络联机等),线程排班器将不分配执行时间给这个线程,直到以下的几个情况让线程回到 Runnable 状态:

  • 线程调用 notify()
  • 线程调用 notifyAll()
  • 线程调用 interrupt()
  • 输入/输出结束

最后,如果执行的工作完成(或发生异常)而离开 run() 方法,则线程执行完毕,进入 Dead 状态。可以使用 isAlive() 方法来测试线程是否存活。

这里举个简单的例子。当使用 Thread.sleep() 让线程暂停执行进入 Not Runnable 状态时,可以使用 interrupt() 让它离开 Not Runnable 状态,当使用 sleep() 暂时进入 Not Runnable 状态而interrupt() 时,会抛出 java.lang.InterruptedException 异常。示例如下:


package cn.sunzn.ithread;public class IThread {        public static void main(String[] args) {                Thread thread = new Thread(new Runnable() {            public void run() {                try {                    Thread.sleep(99999);                } catch (InterruptedException e) {                    System.out.println("I'm interrupted!");                }            }        });                thread.start();        thread.interrupt();    }}

执行结果:

I'm interrupted!

当然如果要暂停线程,但暂停的时间未知,使用 sleep() 并不是一个好方法。可以使用 wait() 方法,然后让别的线程使用 notify() 或 notifyAll() 来通知 Not Runnable 的线程回到 Runnable 状态。


原址:http://www.cnblogs.com/sunzn/archive/2013/03/26/2983343.html

0 0