ThreadPoolExecutor小记

2024-06-07 09:58
文章标签 小记 threadpoolexecutor

本文主要是介绍ThreadPoolExecutor小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阿里要求在创建线程池时 不能使用 Excutors,而要使用ThreadPoolExecutor,具体描述如下:

这里写图片描述

故研究了一下ThreadPoolExecutor,得出的一点小结论记录如下:

ThreadPoolExecutor的构造方法:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {}

当提交的线程小于corePoolSize时,创建新线程来启动
如果提交线程数大于corePoolSize时,将线程加入workQueue中,如果workQueue满了,则继续创建新线程直到线程数等于maximumPoolSize,此时再提交新的线程,则抛出java.util.concurrent.RejectedExecutionException异常

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize, 0L, TimeUnit.SECONDS, new MyBlockingQueue(queueSize));

上述代码中maximumPoolSize>=corePoolSize,否则会抛出java.lang.IllegalArgumentException异常

  • 若提交n个线程(0<=n<=corePoolSize),则线程池创建n个线程并执行
  • 若提交n(corePoolSize < n<=corePoolSize+queueSize),则前corePoolSize个提交的线程直接被创建运行,( n-corePoolSize )个线程加入workQueue中等待执行
  • 若提交n(corePoolSize+queueSize < n<=maximumPoolSize+queueSize , corePoolSize < maximumPoolSize)则前corePoolSize个提交的线程直接被创建运行,( n-corePoolSize
    )个线程加入workQueue中等待执行,(n-corePoolSize-queueSize)再创建新的线程来执行

测试代码

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** @author ElinZhou* @version $Id: ThreadPoolTest.java , v 0.1 2017/1/10 10:33 ElinZhou Exp $*/
public class ThreadPoolTest {public static void main(String... args) throws Exception {ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 6, 0L,TimeUnit.SECONDS, new MyBlockingQueue(1));int nThread = 8;for (int i = 0; i < nThread; i++) {System.out.println("create thread " + i);Thread thread = new Thread(new MyRunnable(i));threadPoolExecutor.submit(thread);}//        TimeUnit.SECONDS.sleep(5);}}class MyBlockingQueue extends LinkedBlockingQueue<Runnable> {public MyBlockingQueue() {super();}public MyBlockingQueue(int nThread) {super(nThread);}@Overridepublic boolean offer(Runnable runnable) {System.out.println("invoke offer method:" + runnable);return super.offer(runnable);}
}class MyRunnable implements Runnable {private int id;public MyRunnable(int id) {this.id = id;}@Overridepublic void run() {System.out.println(id + " start at:" + System.currentTimeMillis());try {Thread.sleep(500);} catch (InterruptedException e) {System.out.println(id + " interrupted at:" + System.currentTimeMillis());}System.out.println("------" + id + " end at:" + System.currentTimeMillis());}@Overridepublic String toString() {return "MyRunnable-" + id;}
}

这篇关于ThreadPoolExecutor小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038856

相关文章

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

logback小记

1、需要的maven依赖: <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version><!--<scope>test</scope>--></dependency><!-- https://mvnrepository.com/artifa

策略模式的小记

策略模式 策略模式支付系统【场景再现】硬编码完成不同的支付策略使用策略模式,对比不同(1)支付策略接口(2)具体的支付策略类(3)上下文(4)客户端(5)小结 策略模式 定义:策略模式是一种行为设计模式,在运行时改变对象的行为。 目的:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。 结构: 策略接口:声明了所有支持的所有算法的公共接口。具体策略:实现了策略

java线程池ThreadPoolExecutor及四大常用线程池

一、线程池的作用         有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间会比线程真正执行的时间还长。而且当线程数量太多时,系统不一定能受得了。                 使用线程池主要为了解决一下几个问题:         a.通过重用线程池中的线程,来减少每个线程创建和销毁的性

类的加载过程与初始化小记

//部分内容来自“狂神说java” 代码验证 解释 1.加载类的信息,加载到内存中,如例子,将Test05和A类的信息加载到方法区, 2.加载完成后,立马生成一个class对象,如例 java.lang.class对象代表Test05类..., 3.执行main方法,通过<clinit>进行初始化 类的初始化

记录|单例模式小记

目录 前言一、单例模式1.1 什么是单例模式1.2 常见单例模式 二、单例模式对比更新时间 前言 参考文章: 去读队友写的代码的时候由于看不懂才去学习的。 一般情况下,这种是用于数据库的开销避免。 例如: public class DBConnectionManager{private static DBConnectionManager instance;