单例模式-线程池场景
单例模式:package day07.java8.pattern.singleton;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadDemo02 {
// 私有属性
// 线程池,不赋值
// service 这个对象,只能被创建一次
private ExecutorService service;
// 构造器,私有,不能被new
private ThreadDemo02(){
// Runtime.getRuntime().availableProcessors() 获取当前机器的逻辑核数量
// 一般我们都再乘以一个2
// 给线程池赋值
service=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
}
// ClassHolder属于静态内部类,在加载类Demo03的时候,只会加载内部类ClassHolder,
// 但是不会把内部类的属性加载出来
private static class ClassHolder{
// 这里执行类加载,是jvm来执行类加载,它一定是单例的,不存在线程安全问题
// 这里不是调用,是类加载,是成员变量
private static final ThreadDemo02 holder =new ThreadDemo02();
}
public static ThreadDemo02 getInstance(){//第一次调用getInstance()的时候赋值
return ClassHolder.holder;
}
public void submit(Runnable task){
service.submit(task);
}
// 批处理任务
public void submit(List tasks){
tasks.stream().forEach(task->service.submit(task));
}
}
提交任务
package day07.java8.pattern.singleton;
public class TestThreadDemo02 {
public static void main(String[] args) {
// 创建实例
ThreadDemo02 threadDemo02 = ThreadDemo02.getInstance();
// 提交第一个任务
threadDemo02.submit(()-> System.out.println("aaaa"));
// 提交第二个任务(随便提交了两个任务,但是线程池用的是一个)
threadDemo02.submit(()-> System.out.println("bbbb"));
}
}



