首页 > 其他分享 >线程池参数

线程池参数

时间:2024-02-16 21:44:22浏览次数:24  
标签:02 17 16 19 任务 参数 线程

1,线程池创建

import java.util.concurrent.ThreadPoolExecutor;

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(7个参数);

 

2,线程池参数介绍

  int corePoolSize:核心线程数;

  int maximumPoolSize:最大线程数;

  long keepAliveTime:线程空闲的存活时间;

  TimeUnit unit:空闲时存活时间的单位,秒分时天月等;

  BlockingQueue<Runnable> workQueue:工作队列;

  ThreadFactory threadFactory:创建线程的工厂;

  RejectedExecutionHandler handler:拒绝策略;


3,测试

3.1,需要执行的任务

public class MyTask implements Runnable {
    /**
     * 标识当前任务的序号
     */
    private int no;

    public MyTask(int no) {
        this.no = no;
    }

    @Override
    public void run() {
        System.out.println(String.format("任务" + no + "开始执行,当前时间:" + MyUtil.getCurrentChineseTime(new Date())));
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException("任务" + no + "在sleep时出错啦");
        }
        System.out.println("任务" + no + "完成,当前时间:" + MyUtil.getCurrentChineseTime(new Date()));
    }
}

3.2,创建线程池,并执行10个任务

        /**
         * 1,核心线程数:2
         * 2,最大线程数:4
         * 3,非核心线程空闲时的存活时间:1秒
         * 4,非核心线程空闲时的存活时间单位:秒
         * 5,工作队列:有界队列(FIFO,界限为3,即最多缓存3个任务)
         * 6,创建线程的工厂:此处为默认工厂Executors.defaultThreadFactory()
         * 7,拒绝策略:此处为默认拒绝策略defaultHandler,即new AbortPolicy(),直接丢弃任务并抛出RejectedExecutionException异常
         */
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));

        // 创建10个待执行的任务,任务序号0-9
        List<MyTask> myTaskList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            MyTask myTask = new MyTask(i);
            myTaskList.add(myTask);
        }

        // 同步(同时)执行任务0-任务9
        for (MyTask myTask : myTaskList) {
            threadPool.execute(myTask);
        }

3.3,运行结果

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.learnjava.threadPool.threadpool.MyTask@5451c3a8 rejected from java.util.concurrent.ThreadPoolExecutor@2626b418[Running, pool size = 4, active threads = 4, queued tasks = 3, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at com.learnjava.threadPool.threadpool.ThreadPoolLearn.main(ThreadPoolLearn.java:31)
任务1开始执行,当前时间:2024-02-16 17:19:30
任务6开始执行,当前时间:2024-02-16 17:19:30
任务0开始执行,当前时间:2024-02-16 17:19:30
任务5开始执行,当前时间:2024-02-16 17:19:30
任务0完成,当前时间:2024-02-16 17:19:32
任务5完成,当前时间:2024-02-16 17:19:32
任务1完成,当前时间:2024-02-16 17:19:32
任务2开始执行,当前时间:2024-02-16 17:19:32
任务6完成,当前时间:2024-02-16 17:19:32
任务3开始执行,当前时间:2024-02-16 17:19:32
任务4开始执行,当前时间:2024-02-16 17:19:32
任务2完成,当前时间:2024-02-16 17:19:34
任务3完成,当前时间:2024-02-16 17:19:34
任务4完成,当前时间:2024-02-16 17:19:34

3.4,结果分析

任务0到任务9同时交给线程池处理,线程池大差不差按时间先后顺序执行如下:

一、线程池创建了2个核心线程执行任务1、任务6;

二、线程池将任务2、任务3、任务4放进了工作队列中,等待执行;

三、线程池创建2个非核心线程执行任务0、任务5;

四、线程池开始处理任务7,但是此时没有空闲线程,4个线程(2个核心线程和2个非核心线程)都在执行任务中,且工作队列已经满了(只能放3个任务),所以执行拒绝策略,预定的策略是直接丢弃且抛出RejectedExecutionException异常;任务8、任务9同理;

五、差不多2秒(任务时间为2秒)后,线程池中的4个线程其中有个执行完成了,则取出队列中的第一个任务(此处认为是任务2)执行,同理有线程空闲了就取出工作队列中的其他两个任务(任务3、任务4)执行;

六、非核心线程,处于空闲状态,时间达到设定的空闲时间时会销毁(或其他操作以节约资源)。

 

4,总结

先看下debug的情况:

4.1,创建核心线程

 

4.2,任务加入工作队列

 

 4.3,debug总结

a,核心线程数量没到时,即使之前创建的核心线程空闲了,也会重新创建一个核心线程来执行任务,不会使用之前创建的核心线程来执行;

b,核心线程到数量后,会一直存活,即使空闲了也不会直接执行新任务,而是等到新任务加入到工作队里后从队列里面取出来执行;

 

标签:02,17,16,19,任务,参数,线程
From: https://www.cnblogs.com/seeall/p/18017515

相关文章

  • 关于多线程的介绍
    一、进程与线程1.进程:进程是操作系统中一种非常重要的软件资源,当我们把一个可执行程序exe运行起来的时候,系统就会随之创建一个进程,如果这个程序结束系统会随之销毁对应的进程。当运行exe文件时,exe文件中的很多内容都加载到内存中,通过分配资源来执行这个程序包含的指令的过程叫......
  • TensorBoard标量图中的平滑曲线是如何做的平滑?—— tensorflow TensorBoard标量图中“
    TensorFlow的tensorboard的平滑曲线的实现代码:使用“指数移动平均”技术实现。地址:https://github.com/tensorflow/tensorboard/blob/34877f15153e1a2087316b9952c931807a122aa7/tensorboard/components/vz_line_chart2/line-chart.ts#L699privateresmoothDataset(datase......
  • 线程池和进程池
    线程池和进程池(1)简介在Python中,线程池(ThreadPoolExecutor)和进程池(ProcessPoolExecutor)是用于并发执行任务的两种机制。它们都可以有效地管理并发执行的任务,并且能够自动管理线程或进程的生命周期,从而简化了并发编程。(1)线程池基于线程的并发:线程池利用了线程的并发执行来......
  • C++多线程 第五章 C++内存模型和原子类型
    第五章C++内存模型和原子类型无论其他语言如何,C++是一门系统编程语言.委员会希望不再需要一个比C++低级的语言.内存模型基础C++程序中所有的数据均是由对象(object)组成的.C++标准定义对象为"存储区域",经管它会为这些对象分配属于它们的类型和生存期.无论什么类型,对象......
  • vue 状态管理vuex Mutation 加传递参数用法
    index.js写法import{createStore}from"vuex";conststore=createStore({  state:{    count:100  },  getters:{    compower(state){      return(id)=>state.count*id    }  },  mutations:{  ......
  • 线程池工作流程 工厂流水线打比方
    线程池工作原理关于线程池的工作原理,我用下面的7幅图来展示。1.通过execute方法提交任务时,当线程池中的线程数小于corePoolSize时,新提交的任务将通过创建一个新线程来执行,即使此时线程池中存在空闲线程。2.通过execute方法提交任务时,当线程池中线程数量达到corePoolSize时,新......
  • Go语言精进之路读书笔记第25条——了解变长参数函数的妙用
    25.1什么是变长参数变长参数函数:调用时可以接受零个、一个或多个实际参数的函数。funcPrintln(a...interface{})(nint,errerror)只能有一个“...T”类型形式参数,且该形式参数应该为函数参数列表中的最后一个形式参数。“...T”类型形式参数在函数内呈现为[]T类型的变......
  • 14.Jenkins 参数化 Job
    参数化Job使用场景 同一个项目需要在不同环境下测试参数化Job的配置 选择参数化构建过程,选择选项参数名称填入env选项配置三个值分别:dev、test、online添加描述配置shell #判断env参数的值,如果是dev,则输出devruntimeif["$env"="dev"......
  • [转帖]linux参数之max_map_count
    https://www.cnblogs.com/duanxz/p/3567068.html “Thisfilecontainsthemaximumnumberofmemorymapareasaprocessmayhave.Memorymapareasareusedasaside-effectofcallingmalloc,directlybymmapandmprotect,andalsowhenloadingsharedlibr......
  • 线程池工作原理和实现原理
     为什么要使用线程池不使用线程池会怎么样?当需要多线程并发执行任务时,只能不断的通过newThread创建线程,每创建一个线程都需要在堆上分配内存空间,同时需要分配虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间,当这个线程对象被可达性分析算法标记为不可用时被GC回收,这样......