• Java 编程下线程的生命周期


    线程的 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 状态。

  • 相关阅读:
    最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决
    分享:fastjson 1.1.28 发布,Java 的 JSON 库
    Google Code Jam
    firefox 17.0 编包记(fedora 17)
    中文分词文献列表 Bibliography of Chinese Word Segmentation
    ThriftUsageC++ Thrift Wiki
    try thrift
    SENNA
    Ghostscript: Ghostscript Downloads
    DHCP简介
  • 原文地址:https://www.cnblogs.com/sunzn/p/2983343.html
Copyright © 2020-2023  润新知