构建千万级高可用企业级Node.js应用吾爱fen享

179 阅读2分钟

download: 构建千万级高可用企业级Node.js应用

在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,所以用户线程也被称之为普通线程。

想要查看线程到底是用户线程还是守护线程,可以通过 Thread.isDaemon() 方法来判断,如果返回的结果是 true 则为守护线程,反之则为用户线程。

我们来测试一下默认情况下线程和线程池属于哪种线程类型?测试代码如下:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程类型:守护线程 OR 用户线程
 */
public class ThreadType {
    public static void main(String[] args) {
        // 创建线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //...
            }
        });
        // 创建线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10,
                0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));
        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("ThreadPool 线程类型:" +
                        (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程"));
            }
        });
        System.out.println("Thread 线程类型:" +
                (thread.isDaemon() == true ? "守护线程" : "用户线程"));
        System.out.println("main 线程类型:" +
                (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程"));
    }
}

从上述结果可以看出,默认情况下创建的线程和线程池都是用户线程。

守护线程定义

守护线程(Daemon Thread)也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当程序中的用户线程全部执行结束之后,守护线程也会跟随结束。
守护线程的角色就像“服务员”,而用户线程的角色就像“顾客”,当“顾客”全部走了之后(全部执行结束),那“服务员”(守护线程)也就没有了存在的意义,所以当一个程序中的全部用户线程都结束执行之后,那么无论守护线程是否还在工作都会随着用户线程一块结束,整个程序也会随之结束运行。

创建守护线程

我们可以通过 Thread.setDaemon(true) 方法将线程设置为守护线程,比如以下代码的实现:

public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            //...
        }
    });
    // 设置线程为守护线程
    thread.setDaemon(true);
    System.out.println("Thread 线程类型:" +
                       (thread.isDaemon() == true ? "守护线程" : "用户线程"));
    System.out.println("main 线程类型:" +
                       (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程"));
}