java多线程 -- 线程池
2023-09-14 09:00:30 时间
第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。
线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行
任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。
为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子 (hook)。但是,强烈建议程序员使用较为方便的 Executors 工厂方法 :
- Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)
- Executors.newFixedThreadPool(int)(固定大小线程池)
- Executors.newSingleThreadExecutor()(单个后台线程)
它们均为大多数使用场景预定义了设置.
线程池封装类(android开发中用过):
package com.company; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * @类名: ThreadUtils * @描述: TODO(线程池工具类) * @作者: soyoungboy */ public class ThreadUtils { private static volatile ThreadUtils instance = null; // private constructor suppresses private ThreadUtils() { } public static ThreadUtils getInstance() { // if already inited, no need to get lock everytime if (instance == null) { synchronized (ThreadUtils.class) { if (instance == null) { instance = new ThreadUtils(); } } } return instance; } /** * 初始化的线程数,有待历史的验证,暂时弄4个 */ public ExecutorService threadPool = Executors.newFixedThreadPool(4); /** * 单线程 */ static ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); /** * 执行延迟任务,类似Timer的效果 */ public ScheduledExecutorService scheduleThreadPool = Executors.newScheduledThreadPool(2); /** * 立即执行任务 * * @param task ThreadUtils.getInstance().excute(run); */ public void excute(Runnable task) { threadPool.execute(task); } /** * 单线程持操作,主要用于数据库的读写异步操作 * * @param task ThreadUtils.getInstance().excuteSingleThread(run); * @return */ public Future excuteSingleThread(Runnable task) { return singleThreadPool.submit(task); } ; /** * 延后执行任务 * * @param task * @param delay ThreadUtils.getInstance().schedule(run,1000); */ public void schedule(Runnable task, long delay) { scheduleThreadPool.schedule(task, delay, TimeUnit.MILLISECONDS); } /** * @return void 返回类型 * @Title: shutdownThreadPool * @Description: TODO() */ public void shutdownThreadPool() { threadPool.shutdownNow(); } /** * @return void 返回类型 * @Title: shutdownThreadPool * @Description: TODO() */ public void shutdownScheduleThreadPool() { scheduleThreadPool.shutdownNow(); } /** * @return void 返回类型 * @Title: shutdownSingleThreadPool * @Description: TODO(单线程池销毁操作) */ public void shutdownSingleThreadPool() { singleThreadPool.shutdownNow(); } }
Demo:
public class TestScheduledThreadPool { public static void main(String[] args) throws Exception { ThreadUtils instance = ThreadUtils.getInstance(); for (int i = 0; i < 10; i++) { instance.schedule(() -> { int num = new Random().nextInt(100);//生成随机数 System.out.println(Thread.currentThread().getName() + " : " + num); }, 3); } instance.shutdownScheduleThreadPool(); } }
结果:
pool-3-thread-2 : 79 pool-3-thread-1 : 87 pool-3-thread-2 : 44 pool-3-thread-1 : 90 pool-3-thread-2 : 0 pool-3-thread-1 : 77 pool-3-thread-2 : 20 pool-3-thread-1 : 63 pool-3-thread-2 : 68 pool-3-thread-1 : 15
相关文章
- Java多线程详解_java支持多线程
- Java连接MySQL mysql-connector-java-bin.jar驱动包的下载与安装
- java启动器_JAVA基础:Java 启动器如何查找类
- java获取服务器路径_JAVA获取服务器路径的方法「建议收藏」
- java生成license_使用truelicense实现用于JAVA工程license机制(包括license生成和验证)…
- java 随机数算法_Java随机数算法原理与实现方法实例详解
- java 唯一随机数_JAVA随机数
- 深入讲解java多线程与高并发:线程池ThreadPool
- Java多线程-守护线程
- java socket详解_Java Socket 编程原理及教程「建议收藏」
- java创建线程池的几种方式_Java中的线程池
- 并发多线程学习(五)Java线程的状态及主要转化方法
- java 多线程和线程池详解编程语言
- Java多线程-线程的生命周期详解编程语言
- 在Linux中查看Java线程:一种方法(linux查看java线程)
- Java InetAddress类及其常用方法
- 测试Java操作Redis实例(java测试redis)
- java基本教程之java线程等待与java唤醒线程java多线程教程
- java基本教程之线程休眠java多线程教程
- java多线程编程之从线程返回数据的两种方法