1、线程的优雅关闭

package tech.icheese.demoserver.controller;

public class Test {
    public static void main(String[] args) {
        System.out.println("main enter!");

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try{
                        System.out.println("t1 is executing");
                        Thread.sleep(500);
                    }catch (InterruptedException e){

                    }
                }
            }
        });
        //t1.setDaemon(true);放开后,进程才会自动关闭
        t1.start();
        System.out.println("main exit");
    }
}

线程设置为守护进程后,执行完毕后进程才会自动关闭

Java中有一个规定,当所有的非守护线程退出后,整个JVM进程就会退出

什么情况下会抛出Interrupted异常?

只有那些声明了会抛出InterruptedException的函数才会抛出异常

Java线程的生命周期

初始线程处于NEW状态

调用start()之后开始执行。进入RUNNING或者READY状态。如果没有调用任何阻塞函数,线程只会在RUNNING和READY之间切换,也就是系统的时间片调度。

一旦调用了任何阻塞函数,线程就会进入WATING或者TIMED_WAITING状态,

如果使用了synchronized关键字或者synchronized块,则会进入BLOCKED状态。

t.interrupted()的精确含义是“唤醒轻量级阻塞”,而不是字面意思“中断一个线程”

synchronized关键字

synchronized关键字其实是“给某个对象加了把锁”

非静态成员函数,锁其实是加在对象a上面

静态成员函数,锁是加在A.class上面的,当热class本身也是对象。

锁就是要实现线程对资源的访问控制,保证同一时间只能有一个线程去访问某一个资源。

synchronized的实现原理

Java的对象头里,有一块数据叫做Mark Word。,锁标志位和占用锁的thread ID

wait()与notify()

wait()内部会先释放锁,然后进入阻塞状态,等待被其他线程notify()唤醒