线程创建的两种方式:
1. 继承Thread类
2.实现Runnable接口
两种方式的比较
1. Runnable方式可以避免Thread方式由于Java单继承特性带来的缺陷
2. Runnable的代码可以被多个线程(Thread实例)共享,适合于多个线程处理统一资源的情况
线程的生命周期
就绪:创建线程对象后,调用了线程的start()方法(此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定开始运行)
阻塞:正在执行的线程由于某种原因,暂时让出CPU资源,暂停了自己的执行,便进入了阻塞状态,如调用了sleep()方法
Java线程有两类
用户线程:运行在前台,执行具体任务(如程序的主线程、连接网络的子线程)
守护线程:运行在后台,为其他前台线程服务
特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作
应用:如数据库连接池中的监测线程 JVM虚拟机启动后的监测线程。
最常见:垃圾回收线程
设置守护线程
调用Thread类的
setDaemon(true)
注意:setDaemon(true)必须在start()方法之前调用,否则会抛出IllegalThreadStateException一场
在守护线程中产生的新线程也是守护线程
不是所有任务都可以分配给守护线程来执行,比如读写操作或计算逻辑