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()唤醒