当前位置: 首页 > article >正文

Java 创建线程池的三种方式

一、 Java 创建线程池主要有以下三种方式

        1. 默认线程池 ForkJoinPool

        2. 通过调用执行器 Executors中的静态方法

        3. 通过 ThreadPoolExector

import java.util.concurrent.*;

// 自定义线程工厂
class MyThreadFactory implements ThreadFactory {
    @Override
    //ThreadFactory 主要是对线程做一些定制: 比如说线程名字
    public Thread newThread(Runnable r) {
        // 创建线程池中的线程
        Thread thread = new Thread(r);
        // 设置线程名称
        thread.setName("Thread-" + r.hashCode());
        // 设置线程优先级(最大值:10)
        thread.setPriority(Thread.MAX_PRIORITY);
        return new Thread(thread );
    }
}

public class ThreadPooling {
    public static void main(String[] args) {

        // 1. 系统自带线程池
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        // 当前线程池中正在执行的线程继续执行完成,未执行的线程中断
        forkJoinPool.shutdown();
        // 当前执行的通过Thread.interrupt()进行中断, 未执行的立即返回
        forkJoinPool.shutdownNow();

        // 2. 不推荐使用这种方式创建线程池 --- 底层还是使用 ThreadPoolExecutor
        ExecutorService executorService1 = Executors.newFixedThreadPool(5);
        ExecutorService executorService2 = Executors.newCachedThreadPool();
        executorService1.shutdown();

        // 3.推荐使用的线程池创建方式
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,
                10,
                60,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(50),
                new MyThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

    }
}

二、ThreadPoolExecutor 中的参数值含义:

  构造方法如图所示:

1.corePoolSize::核心线程数量(核心工作线程数量,当该线程全部工作后,还有任务到达,则将任务放进阻塞队列中

2.maximumPoolSIze:最大工作线程数量(当阻塞队列满了之后,支持继续创建线程参与工作,但是线程池中全部的线程数量不能超过该数值

3.keepAliveTime:存活时间 (当任务干完后,除了核心线程之外的线程存活的时间,超过存活时间则关闭

4.TimeUnit:时间单位(参数3的单位,即多余线程的存活时间单位

5.BlockingQueue<Runnable> workQueue:阻塞队列(线程池存放任务的队列

6. ThreadFactory:线程工厂(定制线程,比如线程名字

7. RejectedExecutionHandler:拒绝策略(当线程池的任务超出线程池队列可以存储的最大值之后,执行的策略

  • AbortPolicy:拒绝并抛出异常。
  • CallerRunsPolicy:使用当前调用的线程来执行此任务。
  • DiscardOldestPolicy:抛弃队列头部(最旧)的一个任务,并执行当前任务。
  • DiscardPolicy:忽略并抛弃当前任务。


http://www.kler.cn/a/15355.html

相关文章:

  • 模型的评估指标——IoU、混淆矩阵、Precision、Recall、P-R曲线、F1-score、mAP、AP、AUC-ROC
  • C++线程基础使用方法
  • android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)
  • ReactPress与WordPress:一场内容管理系统的较量
  • 【深度学习】使用硬件加速模型训练速度
  • 树莓派镜像 DIY 制作
  • 九耶丨阁瑞钛伦特-Java分布式(一)
  • MATLAB算法实战应用案例精讲-【智能优化算法】哈里斯鹰(HHO)(论文篇二)
  • 集成灶/小家电语音提示芯片方案-WTN6040-8S唯创知音自主研发
  • Android类似微信聊天页面教程(Kotlin)四——数据本地化
  • leetcode657. 机器人能否返回原点
  • 移动通信网络频段大全
  • OJ练习第91题——文本左右对齐
  • 3.7 Linux shell脚本编程(分支语句、循环语句)
  • C语言必背经典程序代码
  • 【VM服务管家】VM4.0软件使用_1.3全局模块类
  • Shiro相关知识
  • 获取Tree 树形控件下面的全部id
  • 小米青春版路由器刷openwrt
  • UE5实现Runtime环境下绘制点功能
  • 201709-1 打酱油
  • 基于dsp+fpga+AD+ENDAC的半导体运动台高速数据采集电路仿真设计(四)
  • Qt5.9学习笔记-事件(一)
  • 从线程安全到锁粒度,使用Redis分布式锁的注意事项
  • 【NLP实战】基于Bert和双向LSTM的情感分类【上篇】
  • C#简单向:textbox添加提示内容