⑤. 线程控制(sleep、join、setDeamon)
①. static void sleep(long millis):使当前正在执行的线程停留(暂停执行)指定的毫秒数 (休眠线程)
②. void join():当前线程暂停,等待指定的线程执行结束后,当前线程再继续 (相当于插队加入)
void join(int millis):可以等待指定的毫秒之后继续 (相当于插队,有固定的时间)
③. void yield():让出cpu的执行权(礼让线程)
④.void setDaemon(boolean on):将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出(守护线程)
(相当于象棋中的帅,要是帅没了,别的棋子都会没用了)
守护线程是区别于用户线程哈,用户线程即我们手动创建的线程,而守护线程是程序运行的时候在后台提供一种通用服务的线程。垃圾回收线程就是典型的守护线程
守护线程拥有自动结束自己生命周期的特性,非守护线程却没有。如果垃圾回收线程是非守护线程,当JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴
尬。这就是为什么垃圾回收线程需要是守护线程
t1.setDaemon(true)一定要在start( )方法之前使用
//守护线程和非守护线程的区别是 public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(()-> { while (true) { try { Thread.sleep(1000); System.out.println("我是子线程(用户线程.I am running"); } catch (Exception e) { } } }); //标记为守护线程,setDaemon要在start()方法之前使用 t1.setDaemon(true); //启动线程 t1.start(); Thread.sleep(3000); System.out.println("主线程执行完毕..."); }
⑥. 线程的生命周期
①. 新建:就是刚使用new方法,new出来的线程
②. 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行
③. 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能
④. 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态
比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态
⑤. 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源
⑥. 完整的生命周期图如下: