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

如果对你有帮助,点个赞,或者打个赏吧,嘿嘿
整理不易,请尊重博主的劳动成果

原文地址:https://www.cnblogs.com/Mango-Tree/p/12827777.html