package com.kelvin.util;
import org.springframework.util.StopWatch;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author Kelvin范显
* @createDate 2018年01月11日
*/
public class MyTest {
public static void main(String[] args) throws Exception {
// 核心线程个数,最大线程个数,均为3.
// 每个线程只能空闲0.1秒
// 有定长为1的等待队列, 可以有一个线程排队
ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 3,
100, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1), new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("线程池耗尽,拒绝访问:" + Thread.currentThread().getName());
}
});
pool.allowsCoreThreadTimeOut();
class SelfUtil{
void printPoolSize(){
System.out.println("当前存活线程数:"+pool.getActiveCount());
}
/**
* 每1秒打印线程数, 共打印n次
* @param n
*/
void printPoolSizePer1second(long n){
System.out.println("-----主线程开始等待--------");
for (int i = 0; i <n ; i++) {
doOncePerSecond(()->printPoolSize());
}
System.out.println("-----主线程等待了"+n+"秒--------");
}
}
SelfUtil t = new SelfUtil();
t.printPoolSize();
multiAccess("第一次",pool);
t.printPoolSizePer1second(5);
t.printPoolSize();
multiAccess("第二次",pool);
t.printPoolSizePer1second(5);
t.printPoolSize();
multiAccess("第三次",pool);
t.printPoolSizePer1second(5);
}
/**
* 提交4个任务,每个任务执行2秒
* @param name
* @param pool
*/
private static void multiAccess(String name,ThreadPoolExecutor pool) {
System.out.println("===============================================");
System.out.println(name+"并发访问");
for (int i = 0; i < 4; i++) {
pool.execute(()->{
try {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Thread.sleep(2000);
stopWatch.stop();
System.out.println(Thread.currentThread().getName()+"执行完成,花费了"+stopWatch.getTotalTimeSeconds()+"秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
/**
* 每隔1秒做一次
* @param runnable
*/
private static void doOncePerSecond(Runnable runnable){
try {
Thread.currentThread().sleep(1000);
runnable.run();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
当前存活线程数:0
===============================================
第一次并发访问
-----主线程开始等待--------
当前存活线程数:3
当前存活线程数:3
pool-1-thread-3执行完成,花费了2.0秒
pool-1-thread-1执行完成,花费了2.0秒
pool-1-thread-2执行完成,花费了2.0秒
当前存活线程数:1
当前存活线程数:1
pool-1-thread-3执行完成,花费了2.0秒
当前存活线程数:0
-----主线程等待了5秒--------
当前存活线程数:0
===============================================
第二次并发访问
线程池耗尽,拒绝访问:main
线程池耗尽,拒绝访问:main
-----主线程开始等待--------
当前存活线程数:2
pool-1-thread-1执行完成,花费了2.0秒
pool-1-thread-2执行完成,花费了2.0秒
当前存活线程数:1
当前存活线程数:0
当前存活线程数:0
当前存活线程数:0
-----主线程等待了5秒--------
当前存活线程数:0
===============================================
第三次并发访问
线程池耗尽,拒绝访问:main
线程池耗尽,拒绝访问:main
-----主线程开始等待--------
当前存活线程数:2
当前存活线程数:2
pool-1-thread-1执行完成,花费了2.001秒
pool-1-thread-3执行完成,花费了2.001秒
当前存活线程数:0
当前存活线程数:0
当前存活线程数:0
-----主线程等待了5秒--------
分享到:
相关推荐
### 两种线程池的实现和性能评价 #### 引言 随着计算机技术的发展和分布式系统的需求增加,多线程技术被广泛应用以提高系统效率...未来的研究还可以进一步探索如何在不同场景下优化线程池配置,以达到最佳性能表现。
在现代多线程编程中,Java线程池(Executor框架)扮演着至关重要的角色。它不仅提高了程序的性能,还有效地管理了资源。本文将深入探讨Java线程池的工作原理,并通过实际代码示例,展示如何高效地使用线程池。 ...
这个“binder线程池demo”是基于《开发艺术探索》一书中的示例,旨在帮助开发者理解如何在Android环境中有效地利用线程池进行IPC操作。以下是对这个主题的详细解释: 1. **Binder基础**:Binder是Android系统特有的...
在"**C++线程池源码**"中,我们可以探索如何在C++环境中实现这样的机制。 线程池的工作原理通常包括以下几个关键部分: 1. **工作队列(Work Queue)**:这是描述中提到的关键组件,它负责存储待处理的任务。当有...
### 基于分段的线程池尺寸自适应调整算法 #### 摘要与背景 本文介绍了一种基于分段的线程池尺寸自适应...未来的研究可以进一步探索如何更精确地预测用户请求的趋势,以及如何在更大规模的系统中实现该算法的有效性。
由于此代码多用C++11的模板以及新特性,因此对于一般开发人员略有难度,且由于是在线程池基础上进一步探索定时任务的实现方式,难度进一步加大。关键点是先明白线程池的运作方式。然后再针对定时任务的处理实际上也...
Python中的线程池是一种高效的资源管理机制,它允许开发者预先创建一定数量的线程,然后在需要时分配这些线程来执行任务,而不是每次需要时都创建新的线程。线程池通过避免频繁的线程创建和销毁,提高了程序的性能,...
**标题与描述解析** 标题"libstpool是一个跨平台轻便高效的c,c++语言动态线程池任务池库.zip"表明我们关注的是一个名为libstpool的开源库,它是...在实际项目中,开发者可以根据需求进一步探索其详细用法和高级特性。
### 并发编程之自定义简单线程池详解 #### 基本概念与理论基础 **并发编程**是现代软件开发中一个重要的领域,它...此外,还可以通过在线课程、专业书籍和官方文档等资源进一步学习和探索并发编程的相关知识和技术。
作为五大池之一(内存池、连接池、线程池、进程池、协程池),线程池的应用非常广泛,不管是客户 端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自 接口使用上稍有区别,...
《Android开发艺术探索》是一本针对Android开发者编写的进阶类书籍,涵盖了从Android应用开发的基础到高级优化技巧的一系列知识点。本书通过理论与实践相结合的方式,深入浅出地讲解了Android系统的工作机制,并对...
在这个项目中,开发者可能在探索如何在Netsuite环境中集成WebSocket服务,以便于实现更高效的数据同步和实时通信。 项目包含单线程和线程池两种模式的实现。单线程意味着所有任务都在一个单独的工作线程上执行,...
5. **线程与并发**:讲解Android中的主线程和工作线程,使用Handler、Looper、Runnable、AsyncTask等进行线程间的交互,以及使用ExecutorService进行线程池管理。 6. **网络编程**:涉及HTTP请求的实现,如使用...
第11章 Android的线程和线程池 391 11.1 主线程和子线程 392 11.2 Android中的线程形态 392 11.2.1 AsyncTask 392 11.2.2 AsyncTask的工作原理 395 11.2.3 HandlerThread 402 11.2.4 IntentService 403 11.3 ...
《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些...
librv 是一个轻量级的 Runtime 库,提供了事件循环、毫秒级别的计时器、消息队列、线程池等功能。uv 是一个轻量级的异步 I/O 库,提供了 I/O、timer、async 等功能。 然而,在 IoT 设备上进行 JavaScript 开发也...
Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入...持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不
1. 线程池:线程池预先创建一组线程,当需要执行任务时,线程池会从已存在的线程中分配,而不是每次都创建新的线程。这提高了效率,减少了系统资源的消耗。ThreadPool不仅用于执行一次性任务,还支持周期性任务,如...
第11章 Android的线程和线程池 / 391 11.1 主线程和子线程 / 392 11.2 Android中的线程形态 / 392 11.2.1 Async Task / 392 11.2.2 Async Task的工作原理 / 395 11.2.3 Handler Thread / 402 11.2.4 ...