java 线程知识问答
简介
一个线程的核心线程数是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 线程知识问答的更多相关文章
- Java线程知识
概念 线程生命周期 Java线程模型 线程方法 线程优先级 线程同步 线程在多任务处理应用程序中有着至关重要的作用 概念 基本概念 进程:在操作系统中每个独立运行的程序就是一个进程 线程:程序执行的一 ...
- Java线程知识拾遗
知识回顾 进程与线程是常常被提到的两个概念.进程拥有独立的代码段.数据空间,线程共享代码段和数据空间,但有独立的栈空间.线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程.多线程和多进程都 ...
- Java线程知识:二、锁的简单使用
锁的初步认识 说到锁,相信大家都不陌生,这是我们生活中非常常见的一种东西,它的形状也各式各样.在生活中,我们通常用锁来锁住房子的大门.装宠物的笼子.装衣服的衣柜.以及装着我们一些小秘密的小抽屉.... ...
- Java 基础知识 问答
1,Java为什么能跨平台运行?请简述原理. 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码.然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由J ...
- Java常见知识问答
1.String.StringBuilder.StringBuffer (1).String是字符串常量,不允许改变 (2).StringBuffer先开辟了一块空间,可以允许改变,即向这个空间添加值 ...
- Java 多线程 | 并发知识问答总结
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- java线程基础知识----java daemon线程
java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...
- Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...
随机推荐
- Packet Chasing:通过缓存侧信道监视网络数据包
摘要 本文介绍了一种对网络的攻击--Packet Chasing,这种攻击不需要访问网络,无论接收数据包的进程的特权级别如何,都能发挥作用.一个间谍进程可以很容易地探测和发现网络驱动程序使用的每个缓冲 ...
- 第三章 Spring Boot 整合 Kafka消息队列 消息者
前言 Kafka 是一个消息队列产品,基于Topic partitions的设计,能达到非常高的消息发送处理性能.本文主是基于Spirng Boot封装了Apache 的Kafka-client, ...
- Linux系列:如何用perf跟踪.NET程序的mmap泄露
一:背景 1. 讲故事 如何跟踪.NET程序的mmap泄露,这个问题困扰了我差不多一年的时间,即使在官方的github库中也找不到切实可行的方案,更多海外大佬只是推荐valgrind这款工具,但这款工 ...
- 补充(代码)-入门神经网络-Python 实现(下)
回顾 紧接着上篇, 整到了, MES的公式和代码的实现. \(MSE = \frac {1}{n} \sum\limits_{i=1}^n (y_i - \hat y_i)^2\) n 表示样本数, ...
- Web前端入门第 51 问:移动端适配的视口元标签(meta)常见使用场景
经常查看网页源码的同学应该都有注意到,基本上面向移动端的所有网站都有个 <meta name="viewport" xxx> 这样的HTML元素. 为什么需要 meta ...
- golang 接口按需获取资源
场景 爬虫业务场景,我们需要调用三方接口获取代理ip地址,每个ip地址可以使用的时间有限和价格的,本着不浪费资源,我们在这里做一层封装. 当有其他业务调用我们接口的时候,会拉起定时任务,这个定时任务的 ...
- Linux的二进制表示格式—ELF
之前在解决项目中关于解析core文件中,了解了关于ELF的相关知识,当时还处于萌新(现在还处于萌新状态)对于ELF格式那是一脸懵,今天就对ELF做一个简单的了解. ELF 首先一个文本文件只有经过编译 ...
- C#之方法
在C#中,方法是类的函数成员,方法由两个主要部分: (1)方法头:指定了方法的特征,包括是否返回数据,如果返回,返回什么类型;方法的名称;哪种类型的数据可以传递给方法或从方法返回,以及如何处理这些数据 ...
- 快速修改kafka的broker配置或topic配置
下载开源的kafka界面客户端KafkaKing:https://github.com/Bronya0/Kafka-King 连接后,双击broker配置,或者双击topic配置: 修改好后回车保存就 ...
- XML注入
XML注入 复现使用的题目为buuoj中的[NCTF2019]Fake XML cookbook 1和[NCTF2019]True XML cookbook 1 参考链接为https://xz.ali ...