在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止。本期将为各位带来线程的生命周期与常用方法。关注我的公众号「Java面典」了解更多 Java 相关知识点。
一个线程不是被创建了马上就开始执行,也不是一直处于执行状态。在线程的整个生命周期中会经历新建(New)、
就绪(Runnable)、运行(Running)、阻塞(Blocked)和销毁(Terminated)5 种状态。
指使用 new 关键字创建一个新的线程对象后,该线程就处于新建状态。此时仅由 JVM 为其分配内存,并初始化其成员变量的值。
当线程对象调用了 start() 方法之后,该线程处于就绪状态。JVM 会为其创建方法调用栈和程序计数器,等待调度运行。
如果处于就绪状态的线程获得了 CPU 时钟,开始执行 run() 方法的线程执行体,则该线程处于运行状态。
阻塞状态是指线程因为某种原因放弃了 CPU 使用权,暂时停止运行。阻塞的情况分三种:
如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源。
从线程的生命周期中,我们已经了解到了线程的一些常用方法。线程的常用方法有 wait,notify,notifyAll,sleep,join,yield等。
System.out.println(Thread.currentThread().getName() + "线程运行开始!");
Thread6 thread1 = new Thread6();
thread1.setName("线程 B");
thread1.join();
System.out.println("这时 thread1 执行完毕之后才能执行主线程");
作用:Object 类中的 notify() 方法,唤醒在此对象监视器上等待的单个线程;
如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在唤醒该线程前,调用该线程的 wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有 notifyAll() ,唤醒在此监视器上等待的所有线程。
注意:线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。
守护线程——也称“服务线程”,他是后台线程,它有一个特性,即为用户线程提供公共服务,在没有用户线程可服务时会自动离开;
守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务;
通过 setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在线程对象创建之前用线程对象的 setDaemon 方法;
在 Daemon 线程中产生的新线程也是 Daemon 的;
垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是 JVM 上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源;
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。当 JVM 中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则 JVM 不会退出。
Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗
原文:https://www.cnblogs.com/weechang/p/12507989.html