zoukankan      html  css  js  c++  java
  • 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
    

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

  • 相关阅读:
    mysql 中表和数据库名称不要使用 '-' 命名
    htmlElement.style 是只读属性
    chrome 远程调试相关问题
    纯小白入手 vue3.0 CLI
    纯小白入手 vue3.0 CLI
    纯小白入手 vue3.0 CLI
    《前端之路》- TypeScript (四) class 中各类属性、方法,抽象类、多态
    《前端之路》- TypeScript (三) ES5 中实现继承、类以及原理
    《前端之路》- TypeScript(二) 函数篇
    《前端之路》--- 重温 Egg.js
  • 原文地址:https://www.cnblogs.com/Mango-Tree/p/12827777.html
Copyright © 2011-2022 走看看