Java单例线程池,管理线程池的创建和使用

简介: 话不多说,先上代码,觉得有用点个赞
importcn.hutool.core.thread.ThreadFactoryBuilder;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjava.util.concurrent.*;
publicenumThreadPoolSingleton {
/*** 线程池实例*/INSTANCE;
privatefinalThreadPoolExecutorexecutor;
privatefinalLoggerlogger=LoggerFactory.getLogger(ThreadPoolSingleton.class);
publicThreadPoolExecutorgetInstance() {
returnexecutor;
    }
ThreadPoolSingleton() {
//记录异常ThreadFactorynamedThreadFactory=ThreadFactoryBuilder.create()
                .setNamePrefix("admin-thread-")
                .setUncaughtExceptionHandler((thread, throwable) ->logger.error("ThreadPool {} got exception", thread, throwable))
                .build();
//核心线程数大小finalintcorePoolSize=4;
//最大线程数大小,阻塞队列占满后会在线程池中继续开启新的线程,总的线程数量不会大于最大线程数finalintmaximumPoolSize=4;
//最大线程数空闲后的存活时间finallongkeepAliveTime=1L;
//最大线程数空闲后的存活时间的单位finalTimeUnittimeUnit=TimeUnit.MINUTES;
//阻塞队列,核心线程数占满后会把新入线程放入阻塞队列finalArrayBlockingQueue<Runnable>workQueue=newArrayBlockingQueue<>(10);
//拒绝策略,最大线程数占满之后会执行此策略//由调用线程(提交任务的线程)处理该任务finalThreadPoolExecutor.CallerRunsPolicycallerRunsPolicy=newThreadPoolExecutor.CallerRunsPolicy();
//丢弃任务并抛出RejectedExecutionException异常//final ThreadPoolExecutor.CallerRunsPolicy CALLER_RUNS_POLICY = new ThreadPoolExecutor.AbortPolicy();//丢弃任务,不抛异常//final ThreadPoolExecutor.CallerRunsPolicy CALLER_RUNS_POLICY = new ThreadPoolExecutor.DiscardPolicy();//丢弃队列中最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务//final ThreadPoolExecutor.CallerRunsPolicy CALLER_RUNS_POLICY = new ThreadPoolExecutor.DiscardOldestPolicy();executor=newThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, workQueue, namedThreadFactory, callerRunsPolicy);
    }
/*** 需要获取返回值调用此方法** @Param callable* @param <T>* @return*/publicstatic<T>Future<T>submit(Callable<T>callable) {
returnINSTANCE.getInstance().submit(callable);
    }
/*** 不需要获取返回值调用此方法** @param runnable*/publicstaticvoidexecute(Runnablerunnable) {
INSTANCE.getInstance().execute(runnable);
    }
}

使用示例

获取返回值

importjava.util.concurrent.Callable;
importjava.util.concurrent.ExecutionException;
importjava.util.concurrent.Future;
publicclassMain {
publicstaticvoidmain(String[] args) {
// 创建一个 Callable 任务Callable<Integer>callable=newCallable<Integer>() {
@OverridepublicIntegercall() throwsException {
// 执行耗时操作,并返回结果returnlongRunningTask();
            }
        };
// 提交任务并获取 Future 对象Future<Integer>future=ThreadPoolSingleton.submit(callable);
try {
// 阻塞等待任务执行完成并获取结果intresult=future.get();
System.out.println("任务执行结果: "+result);
        } catch (InterruptedException|ExecutionExceptione) {
e.printStackTrace();
        }
    }
privatestaticintlongRunningTask() {
// 执行耗时操作,这里假设返回一个数值return42;
    }
}

不需要返回值

publicclassMain {
publicstaticvoidmain(String[] args) {
// 创建一个实现了 Runnable 接口的任务Runnablerunnable=newRunnable() {
@Overridepublicvoidrun() {
// 执行耗时操作longRunningTask();
            }
        };
// 提交任务ThreadPoolSingleton.execute(runnable);
    }
privatestaticvoidlongRunningTask() {
// 执行耗时操作System.out.println("任务执行中...");
    }
}
目录
相关文章
|
2天前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
24 2
|
2天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
17 2
|
2天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第19天】多线程编程是Java中的一个重要概念,它允许程序员在同一时间执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动和管理,以及如何通过多线程提高程序的性能和响应性。
|
2天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
13 5
|
3天前
|
消息中间件 安全 Java
理解Java中的多线程编程
【5月更文挑战第18天】本文介绍了Java中的多线程编程,包括线程和多线程的基本概念。Java通过继承Thread类或实现Runnable接口来创建线程,此外还支持使用线程池(如ExecutorService和Executors)进行更高效的管理。多线程编程需要注意线程安全、性能优化和线程间通信,以避免数据竞争、死锁等问题,并确保程序高效运行。
|
3天前
|
监控 安全 NoSQL
采用java+springboot+vue.js+uniapp开发的一整套云MES系统源码 MES制造管理系统源码
MES系统是一套具备实时管理能力,建立一个全面的、集成的、稳定的制造物流质量控制体系;对生产线、工艺、人员、品质、效率等多方位的监控、分析、改进,满足精细化、透明化、自动化、实时化、数据化、一体化管理,实现企业柔性化制造管理。
24 3
|
3天前
|
存储 Java
【Java】实现一个简单的线程池
,如果被消耗完了就说明在规定时间内获取不到任务,直接return结束线程。
11 0
|
3天前
|
Python
|
6天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
17 1
|
2天前
|
NoSQL Redis 缓存
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
【5月更文挑战第17天】Redis常被称为单线程,但实际上其在处理命令时采用单线程,但在6.0后IO变为多线程。持久化和数据同步等任务由额外线程处理,因此严格来说Redis是多线程的。面试时需理解Redis的IO模型,如epoll和Reactor模式,以及其内存操作带来的高性能。Redis使用epoll进行高效文件描述符管理,实现高性能的网络IO。在讨论Redis与Memcached的线程模型差异时,应强调Redis的单线程模型如何通过内存操作和高效IO实现高性能。
28 7
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?