简介

一个线程的核心线程数是4, 最大线程数是8, 有一个任务提交过来, 迅速执行王弼, 如果再来一个任务, 那么线程池是新建一个线程去执行还是会复用之前的线程?

参考链接

https://blog.csdn.net/hu10131013/article/details/105665232 (逻辑图片清晰)

https://www.cnblogs.com/jxxblogs/p/11655670.html (测试代码来源)

answer

根据线程创建的逻辑而言.



如果没有创建了4个核心线程, 会创建一个新线程来执行. 虽然第一个线程使用完毕了.

测试代码

import com.sun.xml.internal.ws.util.StringUtils;

import java.io.Console;
import java.util.concurrent.*; /**
* Created by lee on 2021/6/28.
*/
public class ThreadPoolLocal {
public static void main(String[] args) throws InterruptedException {
int size = 5;
ThreadPoolExecutor es1 = new ThreadPoolExecutor(
4, // corePoolSize
8, // int maximumPoolSize
1,// long keepAliveTime
TimeUnit.DAYS, // TimeUnit unit
new LinkedBlockingQueue<>(10) // BlockingQueue<Runnable> workQueue
);
for(int i=0; i<size; i++){
es1.execute(new DemoTask(i)); System.out.println("poolSize: " + es1.getPoolSize());
System.out.println("corePoolSize: " + es1.getCorePoolSize());
System.out.println("maximumPoolSize:" + es1.getMaximumPoolSize());
System.out.println("queue:" + es1.getQueue().size());
System.out.println("completedTaskCount:" + es1.getCompletedTaskCount());
System.out.println("largestPoolSize:" + es1.getLargestPoolSize());
System.out.println("keepAliveTime:" + es1.getKeepAliveTime(TimeUnit.SECONDS));
Thread.sleep(3000); // 沉睡3s在执行下一个任务. 上一个任务2s就执行完毕了, 但是因为没有达到核心线程数, 还是去创建了新的线程. }
es1.shutdown();
}
} class DemoTask implements Runnable {
private int taskNum;
public DemoTask(int taskNum) {
this.taskNum = taskNum;
} @Override
public void run() {
System.out.println("正在执行" + taskNum);
try {
Thread.sleep(2000);
}catch(InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("执行完毕" + taskNum);
}
}

线程池和核心参数和拒绝策略有哪些?

线程池的构造函数有一些是默认的. 比如测试代码中使用的就是有部分默认的

完整的应该是如下


/**
* Creates a new {@code ThreadPoolExecutor} with the given initial
* parameters and default thread factory.
*
* @param corePoolSize the number of threads to keep in the pool, even
* if they are idle, unless {@code allowCoreThreadTimeOut} is set
* @param maximumPoolSize the maximum number of threads to allow in the
* pool
* @param keepAliveTime when the number of threads is greater than
* the core, this is the maximum time that excess idle threads
* will wait for new tasks before terminating.
* @param unit the time unit for the {@code keepAliveTime} argument
* @param workQueue the queue to use for holding tasks before they are
* executed. This queue will hold only the {@code Runnable}
* tasks submitted by the {@code execute} method.
* @param handler the handler to use when execution is blocked
* because the thread bounds and queue capacities are reached
* @throws IllegalArgumentException if one of the following holds:<br>
* {@code corePoolSize < 0}<br>
* {@code keepAliveTime < 0}<br>
* {@code maximumPoolSize <= 0}<br>
* {@code maximumPoolSize < corePoolSize}
* @throws NullPointerException if {@code workQueue}
* or {@code handler} is null
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
}
     * @param handler the handler to use when execution is blocked
* because the thread bounds and queue capacities are reached // 当阻塞队列已经满了的时候, 我们应该使用哪些拒绝策略

handler 就是拒绝策略, 简单来说.

默认是会抛出异常, 将demo代码中的size 改成 100 可以看到抛出了一个异常.

1、AbortPolicy:直接抛出异常。

2、CallerRunsPolicy:只用调用者所在线程来运行任务。 -- 简单来说, 就是上述demo的main线程来运行任务.

3、DiscardOldestPolicy:丢弃队列里最老(引用文献使用最近,感觉有问题)的一个任务,并执行当前任务。

4、DiscardPolicy:不处理,丢弃掉。

简单理解:

如果很线程任务涌入的话, 直接奔溃报错.

主线程分配了任务, 我线程池接受不了, 拒绝, 你自己做吧.

新来的任务最重要, 旧的任务我就不做了.

直接丢弃. 不做了.

java 线程知识问答的更多相关文章

  1. Java线程知识

    概念 线程生命周期 Java线程模型 线程方法 线程优先级 线程同步 线程在多任务处理应用程序中有着至关重要的作用 概念 基本概念 进程:在操作系统中每个独立运行的程序就是一个进程 线程:程序执行的一 ...

  2. Java线程知识拾遗

    知识回顾 进程与线程是常常被提到的两个概念.进程拥有独立的代码段.数据空间,线程共享代码段和数据空间,但有独立的栈空间.线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程.多线程和多进程都 ...

  3. Java线程知识:二、锁的简单使用

    锁的初步认识 说到锁,相信大家都不陌生,这是我们生活中非常常见的一种东西,它的形状也各式各样.在生活中,我们通常用锁来锁住房子的大门.装宠物的笼子.装衣服的衣柜.以及装着我们一些小秘密的小抽屉.... ...

  4. Java 基础知识 问答

    1,Java为什么能跨平台运行?请简述原理. 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码.然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由J ...

  5. Java常见知识问答

    1.String.StringBuilder.StringBuffer (1).String是字符串常量,不允许改变 (2).StringBuffer先开辟了一块空间,可以允许改变,即向这个空间添加值 ...

  6. Java 多线程 | 并发知识问答总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  7. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  8. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  9. java线程基础知识----java daemon线程

    java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...

  10. Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

    package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...

随机推荐

  1. 刷题——关于struts框架,下面那些说法是正确的?

    关于struts框架,下面那些说法是正确的? Struts中无法完成上传功能 Struts框架基于MVC模式 Struts框架容易引起流程复杂.结构不清晰等问题 Struts可以有效地降低项目的类文件 ...

  2. Docker光速入门

    1.docker是什么,能干什么 Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...

  3. Spring基于xml的CRUD

    目录 基于xml的CRUD 代码实现 测试 基于xml的CRUD 源码 使用C3P0连接池 使用dbutils包中的QueryRunner类来对数据库进行操作 代码实现 pom.xml <?xm ...

  4. 【经验】Python3|输入多个整数(map方法或ctypes调用C标准库scanf)

    文章目录 方法一:多次调用input 1. 代码 方法二:调用C标准库 1. 代码 2. 残留的问题(int数组取元素) 附:计算时间差的程序(使用实例) 第一种读取方式: 第二种读取输入方式: 方法 ...

  5. B1031 查验身份证 (15 分)

    描述 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5 ...

  6. 2025 CCPC打铁记

    Day -? 报名参加 \(CCPC\) Day -1 周天比赛,周六签到. 早上依旧是在 \(lyyz\) 打练习赛. 中午 \(12:30\) 上车,结果教练忘了通知我,再加上我把北门认成南门,导 ...

  7. Huawei Matebook e 2022 安装 archlinux 双系统

    本文同步发布于我的网站 安装之前 wifi 名称修改为英文+数字的,以防之后没法联网 准备好 U 盘并使用 GPT 分区表写入最新的 arch 镜像. 基础安装 开机按 F2 进入 UEFI/BIOS ...

  8. 2024牛客多校2I Red Playing Cards

    本文同步于我的博客. Problem There are \(2\cdot n\) cards arranged in a row, with each card numbered from \(1\ ...

  9. 启智树提高组day3T1 3479 : A:climb 树

    启智树提高组day3T1 3479 : A:climb 树 题目描述 DoubleDuck山是X省的著名旅游景点.这一天,淘淘慕名而来,打算爬到山顶处. DoubleDuck山的构造是十分特殊的.在这 ...

  10. C++项目属性配置Tips

    1.项目属性->VC++目录->包含目录 & 库目录 这里的"包含目录"."库目录"编辑之后是全局的: 2.项目属性->C/C++-& ...