Java线程
Java线程
线程的创建方式
继承Thread类并重写run方法(假定为MyThread类)
实现Runnable接口并实现run方法(假定为MyRun类)
线程的三种启动方式
new MyThread().start(); //注意:调用的是start方法而不是run方法,如果直接调用run方法则只是简单的方法调用,依旧是单线程,而不是多线程
new Thread(new MyRun()).start;
Executors.newCachedThreadPool().submit(() -> System.out.println("线程池方式")); //该处使用线程池结合Lambda方式新建并启动线程
线程的几个基本方法
sleep:当前线程暂停一段时间,将CPU资源让给其他线程使用,但是不会释放已经获得的对象资源
yield:将当前线程放入到就绪队列中,不过CPU下一次从就绪队列中获取线程时,依然有可能把刚调用yield方法的线程从就绪队列中取出执行
join:在当前线程调用其他线程的join方法,相当于在这个位置等待另一个线程执行完毕后再往下执行,会让出CPU资源,线程间嵌套调用join方法可以保证线程之间的完成顺序
线程的六个状态
NEW:使用new关键字创建了线程,但是未调用start方法时的状态
RUNNABLE:被线程调度器执行时的状态,内部还存在有READY和RUNNING两个子状态,其中处于就绪队列的所有线程的状态都是READY
TIME_WAITING:等待指定时长的睡眠状态,指定时间后会被唤醒进入到就绪队列中
WAITING:睡眠状态
BLOCKED:线程未获得锁时所处的阻塞状态
TERMINATED:结果状态
线程状态转换图
守护线程
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他线程的线程,当非守护线程停止后,守护线程才会停止
例如JVM中的gc线程就是一个守护线程,但是我们Java程序的main线程并不是一个守护线程,守护线程的设定可以在调用start方法之前通过t.setDaemon(true)将进程设置为守护进程
public class Mango{
public static void main(String[] args){
new Demo();
System.out.println(Thread.currentThread().getName() + "是否守护线程:" + Thread.currentThread().isDaemon());
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "是否守护线程:" + Thread.currentThread().isDaemon());
});
thread.setDaemon(true);//设置为守护线程
thread.start();
System.gc();//调用垃圾收集器
}
}
class Demo {
@Override
protected void finalize() {//该方法是Object类中的方法,在垃圾收集器释放该对象时会被执行,可以理解为该对象的遗言
System.out.println(Thread.currentThread().getName() + "是否守护线程:" + Thread.currentThread().isDaemon());
}
}
对应的执行结果
main是否守护线程:false
Finalizer是否守护线程:true
Thread-0是否守护线程:true
如果对你有帮助,点个赞,或者打个赏吧,嘿嘿
整理不易,请尊重博主的劳动成果