一个例子理解线程池的执行过程,及参数的配置。
package com.threadpool;
import java.util.concurrent.*;
/**
* 自定义的线程池
*
* corePoolSize核心线程1个:
* 没有任务需要执行的时候线程池的大小,如果任务数比较多会开启其他线程,但是不会超过最大线程数。
* 在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动,
* 除非调用了prestartCoreThread/prestartAllCoreThreads事先启动核心线程
*
* maximumPoolSize最大线程2个:
* 线程池中允许的最大线程数,线程池中的当前线程数目不会超过该值。如果任务比较多的时候,可以将任务添加到缓冲池中。
* keepAliveTime存活时间:
* 120S
* 缓冲任务3:
* 超过就会被reject拒绝
* 这里的超过是指:分配的任务数大于最大线程数和缓冲线程数之和
*
* 拒绝任务:
* 超过指定范围的限制就会拒绝
*/
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(1,//corePoolSize
2,//maximumPoolSize
60,//keepAliveTime
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),//缓冲池
new Reject()//拒绝任务类);
Task t1 = new Task("1","任务1");
Task t2 = new Task("2","任务2");
Task t3 = new Task("3","任务3");
Task t4 = new Task("4","任务4");
Task t5 = new Task("5","任务5");
Task t6 = new Task("6","任务6");
Task t7 = new Task("7","任务7");
Task t8 = new Task("8","任务8");
Task t9 = new Task("9","任务9");
Task t10 = new Task("10","任务10");
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.execute(t6);
pool.execute(t7);
pool.execute(t8);
pool.execute(t9);
pool.execute(t10);
getAliveThread(pool);
}
/**
* 获取线程池的线程数据
* @param pool
*/
public static void getAliveThread(ThreadPoolExecutor pool){
Thread t = new Thread(new Runnable() {
public void run() {
while (true){
try {
Thread.sleep(1000);
System.out.println("########返回核心线程数:"+pool.getCorePoolSize());
System.out.println("########返回正在执行任务的线程的大概数量:"+pool.getActiveCount());
System.out.println("########返回池中当前的线程数:"+pool.getPoolSize());
System.out.println("########返回计划执行的任务的大概总数:"+pool.getTaskCount());
System.out.println("########返回池中当前的线程数:"+pool.getPoolSize());
System.out.println("########回完成执行的任务的大致总数:"+pool.getCompletedTaskCount());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
}
}
Task类
package com.threadpool;
public class Task implements Runnable{
private String taskId;
private String taskName;
public Task(String taskId,String taskName){
this.taskId = taskId;
this.taskName = taskName;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
try {
System.out.println("taskName:"+taskName+",开始执行");
Thread.sleep(3000);
System.out.println("taskName:"+taskName+",完成操作");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return taskName.toString();
}
}
Reject类
package com.threadpool;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
public class Reject implements RejectedExecutionHandler {
public Reject(){
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("##被拒绝的任务:"+r.toString());
}
}
执行结果:
taskName:任务1,开始执行
##被拒绝的任务:任务7
taskName:任务6,开始执行
##被拒绝的任务:任务8
##被拒绝的任务:任务9
##被拒绝的任务:任务10
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:0
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:0
taskName:任务1,完成操作
taskName:任务6,完成操作
taskName:任务2,开始执行
taskName:任务3,开始执行
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:2
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:2
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:2
taskName:任务3,完成操作
taskName:任务4,开始执行
taskName:任务2,完成操作
taskName:任务5,开始执行
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:4
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:4
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:2
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:4
taskName:任务5,完成操作
taskName:任务4,完成操作
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6
########返回核心线程数:1
########返回正在执行任务的线程的大概数量:0
########返回池中当前的线程数:2
########返回计划执行的任务的大概总数:6
########返回池中当前的线程数:2
########回完成执行的任务的大致总数:6