首页 > 编程语言 >Java笔记(九):线程池

Java笔记(九):线程池

时间:2023-05-26 17:22:59浏览次数:39  
标签:CallerRunsPolicy Java Executors MAX 笔记 线程 public ThreadPoolExecutor

三大方法

Executors.newSingleThreadExecutor(); // 单个线程
Executors.newFixedThreadPool(5); // 固定的线程池大小
Executors.newCachedThreadPool(); // 可伸缩的

以上底层都是由 ThreadPoolExecutor 实现

阿里开发手册:线程池不允许使用 Executors 去创建, 而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学更加明确线程池的运行规则, 规避资源耗尽的风险。
Executors 返回的线程池对象的弊端如下:

  • FixedThreadPool 和 SingleThreadPool:允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
  • CachedThreadPool:允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
  • ScheduledThreadPool:允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

七大参数

public ThreadPoolExecutor(
	int corePoolSize,
	int maximumPoolSize,
	long keepAliveTime,
	TimeUnit unit,	// TimeUnit.SECONDS
	BlockingQueue<Runnable> workQueue,	// new LinkedBlockingDeque<>(3)
	ThreadFactory threadFactory,	// Executors.defaultThreadFactory()
	RejectedExecutionHandler handler // new ThreadPoolExecutor.AbortPolicy()
)	

四种策略

  • AbortPolicy 如果线程池拒绝了任务,直接报错
  • CallerRunsPolicy 线程池让调用者去执行
public static class CallerRunsPolicy implements RejectedExecutionHandler {
	public CallerRunsPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
		if (!e.isShutdown()) {
			r.run(); // 可以看见源码逻辑为,先判断线程池还未关闭,然后直接r.run运行了任务。
		}
	}
}
  • DiscardPolicy 如果线程池拒绝了任务,直接丢弃
  • DiscardOldestPolicy 如果线程池拒绝了任务,直接将线程池中最旧的,未运行的任务丢弃,将新任务入队

标签:CallerRunsPolicy,Java,Executors,MAX,笔记,线程,public,ThreadPoolExecutor
From: https://www.cnblogs.com/Bota5ky/p/17435303.html

相关文章

  • 考古笔记6:单臂路由子接口实现VLAN间通讯
    拓扑构成拓扑:配置过程配置信息:R1R1#conftEnterconfigurationcommands,oneperline.EndwithCNTL/Z.R1(config)#interfacef0/0R1(config-if)#noshutR1(config-if)#interfacef0/0.1R1(config-subif)#encapsulationdot1Q10//后面的数字1代表是的侦听VLAN号为10......
  • 渲染管线导论(龙书笔记)
    渲染管线总体流程InputAssembler(IA)->VSShader(VS)->HullShader(HS)->TessellatorStage->DomainShader(DS)->GeometryShader(GS)->[StreamOutput(SO)]->Rasterizer(RS)->PixelShader(PS)->OutputMerget(OM)输入(图元)装配->......
  • 基于JAVA的虚拟页面置换算法
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]一概述目的:实现OPT、FIFO、LRU三种置换算法。主要完成任务:实现三种算法并计算出每种算法的却页数,且以表格形式输出结果。使用开发工具:Eclipse—Java。解决主要问题:编写出可视化窗口输出运行结果。二使用的基本概念和原理OPT:在分配......
  • C++写得统计线程利用率的小工具
    thread_usage.h#ifndef__THREAD_USAGE__#define__THREAD_USAGE__#include<fstream>#include<string>#include<map>#include<pthread.h>#include<sys/time.h>namespacethread{classCThreadUsage{pu......
  • Java大文件分片上传/多线程上传源代码
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • Java第四日
    今日份Java学习内容循环缘由与定义while循环结构调试程序do-while循环结构for循环  1.  循环缘由与定义     核心要点:在某种场景(多次重复做同一件事的情况)需要使用循环结构,特点:提高效率。 循环结构特点:1.循环条件(初始值、结束值)       ......
  • Java订单号生成唯一
    公司需要开发商城项目,用到了,记录一下Java订单号生成唯一packagecom.iot.store.utils;importorg.apache.commons.lang3.RandomStringUtils;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassOrderIDGenerator{publicstati......
  • 【atcoder begin 302】【e题 Isolation 】JAVA的快速输入输出
    importjava.io.*;importjava.util.HashSet;importjava.util.Set;/***@authorfishcanfly*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{//BufferedReaderbr=newBufferedReader(newInputStreamReader(......
  • Javascript 指南:条件语句
    if/elseif/else语句是程序如何以编程方式处理是/否问题。如果第一个条件的计算结果为true,则程序将运行第一个代码块。否则,它将运行else块。让天气=“下雨”;如果(天气===“下雨”){控制台。log("今天别忘了带伞!");}否则{控制台。日志(“今天可能会很好”!);}输出:Don......
  • Javascript 指南:数组
    数组数组是JavaScript的有序列表,可以存储任何数据类型,包括字符串、数字和布尔值。数组中的每个项目都位于一个编号位置。句法数组由方括号和里面的内容表示。数组中的元素应该用逗号分隔。让colors=["red","blue","green","yellow"];访问和更新元素要访问或更改数组中......