线程池的关闭有点问题
//自定义线程池
public class MyThreadPool {
private int poolSize; //当前线程数
private int corePoolSize; //线程数
private int maxPoolSize; //最大线程数
private int queueSize; //任务数
private BlockingQueue<runnable> queue; //任务队列
private int kxseconds; //线程空闲多少秒之后,中断所有线程
//拒绝策略:任务队列满,阻塞加入队列(不加入,直到队列有空的位置).线程池自动扩容
private boolean isrunning;
private AtomicInteger num = new AtomicInteger();
private CopyOnWriteArrayList<thread> threads = new CopyOnWriteArrayList<thread>();
public MyThreadPool(int corePoolSize,int maxPoolSize,int queueSize,int kxseconds){
this.poolSize = 0; //当前线程数
this.corePoolSize=corePoolSize; //线程数
this.maxPoolSize=maxPoolSize; //最大线程数
this.queueSize=queueSize; //任务数
queue=new ArrayBlockingQueue<runnable>(queueSize); //任务队列
this.kxseconds=kxseconds; //线程空闲多少秒之后,中断所有线程
this.isrunning = true; //线程池启动
new ClearThread().start();
}
public static void main(String[] args)throws Exception {
int corePoolSize = 2;
int maxPoolSize=8;
int queueSize=20;
int kxseconds=60;
MyThreadPool pool = new MyThreadPool(corePoolSize,maxPoolSize, queueSize, kxseconds);
Thread t1 = pool.test(pool);
t1.start();
Thread t2 = pool.test(pool);
t2.start();
Thread.sleep(30*1000);
//pool.close();
}
Thread test(final MyThreadPool pool){
return new Thread(){
public void run(){
Print task = null;
for(int i=1;i可执行-&gt;执行-&gt;阻塞-&gt;终止
void newThread(){
Thread t = new Thread(new Worker());
threads.add(t);
t.start();
poolSize++;
System.out.println("thread " + poolSize);
}
//关闭线程池
void close(){
//this.isrunning = false;
}
private class Worker implements Runnable{
public void run(){
try {
while(isrunning&amp;&amp;!Thread.currentThread().isInterrupted()){
Runnable task = queue.take();
if(task!=null)
task.run();
System.out.println("队列大小:"+queue.size());
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Print implements Runnable{
public void run() {
System.out.println(num.incrementAndGet()+": "+queue.size());
}
}
class ClearThread extends Thread{
public ClearThread(){
super("threadpool-clear");
setDaemon(true); //主线程结束,ClearThread线程也自动结束
}
public void run(){
int num = corePoolSize-poolSize;
for(int i=0;i<num newthread try for if>=queueSize*0.8 &amp;&amp; poolSize<maxpoolsize newthread if>=corePoolSize){
for(int i=0;i<poolsize-corepoolsize system.out.println threads.get thread.currentthread catch e e.printstacktrace></poolsize-corepoolsize></maxpoolsize></num></runnable></thread></thread></runnable>
分享到:
相关推荐
Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...
通过自定义线程池,我们可以更好地控制线程的行为,比如限制并发执行的任务数量,减少线程的创建和销毁开销,以及更好地管理系统资源。 标题中的"C# ——自定义线程池",意味着我们将探讨如何利用C#语言构建一个...
ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 ...poolSize 自定义线程池大小 通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行任务
Spring Boot利用@Async实现异步调用:自定义线程池 Spring Boot是一个流行的Java框架,它提供了许多实用的特性来简化应用程序的开发。其中,异步调用是Spring Boot中的一个重要特性,它允许开发者将一些耗时的任务...
`C#`标准线程池`System.Threading.ThreadPool`提供了丰富的功能,但有时我们需要根据特定需求自定义线程池。本篇将深入探讨如何在`C#`中实现自定义线程池,并基于描述中的源码进行解析。 首先,自定义线程池通常...
JAVA 自定义线程池的最大线程数设置方法 JAVA 自定义线程池的最大线程数设置方法是指在创建线程池时,设置线程池的最大线程数,以确保线程池的高效运行。线程池的最大线程数设置方法主要取决于任务的类型,即CPU...
Java多线程学习笔记之自定义线程池 本篇文章主要介绍了Java多线程学习笔记之自定义线程池,通过深入了解ThreadPoolExecutor这个核心类,我们可以自定义线程池,满足不同的线程池需求。 Java多线程学习笔记之自定义...
自定义的线程池类,自己写的一个组件,用起来还是挺方便的。我已经用在了好几个项目上。 资源中包括一个DLL文件和一个XML文件,XML文件是方法和属性的一个注释文档,将其和DLL放置同一个目录下后,引用DLL后,使用...
Android编程自定义线程池与用法示例 Android编程自定义线程池与用法示例主要介绍了Android编程自定义线程池与用法,结合实例形式分析了Android线程池的功能、定义及简单使用方法。下面将详细说明标题和描述中所说的...
java自定义线程池的原理简介 java自定义线程池的原理简介是Java开发中非常重要的一种技术,它可以帮助我们更好地管理线程池,提高系统的性能和可靠性。在这篇文章中,我们将详细介绍java自定义线程池的原理详解,...
4. **自定义线程池的动机**:虽然标准的`ThreadPool`已经很强大,但在某些特定场景下,如需要更精细的线程控制、特定的调度策略或资源限制时,可能需要创建自定义线程池。 5. **创建自定义线程池**:创建自定义...
一个自定义线程池,支持任务运行时间统计、失败重启、自适应队列长度
#### 三、自定义线程池设计 基于`Executor`接口,我们可以实现一个简单的线程池。首先,定义必要的属性: - `wc`: 当前线程数量。 - `coreThreadPool`: 核心线程数。 - `maxThreadPool`: 最大线程数。 - `...
// 设置自定义线程池 } @Bean(name = "customThreadPool") public TaskExecutor customThreadPool() { // 同方法一的配置 } } ``` 2. **Controller中使用:** 在Controller方法中,通过`@Async`注解来标记...
Job 可以是自定义的业务逻辑,如发送邮件、处理数据库操作等。 4. **线程复用**:一旦 Job 执行完毕,该线程将返回到线程池,等待执行下一个任务。这种复用机制减少了创建和销毁线程的开销。 ### 三、Quartz ...
自定义线程池可以让我们根据项目的需求来调整线程池的参数,从而提高系统的性能和稳定性。 二、自定义线程池的配置 要自定义线程池,需要创建一个配置类,用于存储线程池的参数。该类使用 `@...
一、自定义线程池配置类 在 Spring Boot 中,我们可以使用 `@ConfigurationProperties` 注解来定义自定义的配置类。例如,我们可以创建一个 `TaskThreadPoolConfig` 类,如下所示: ```java package ...
通过深入研究和使用本资源提供的"JAVA经典线程池源码",开发者不仅可以理解线程池的基本工作原理,还能学习到如何自定义线程池以适应特定场景,从而提高程序的并发性能和稳定性。在实际项目中,结合Java并发API的...