创建一个线程池(参数解读):
ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(5), new ThreadPoolExecutor.CallerRunsPolicy() );
线程任务:打印当前任务被哪个线程执行
package concurrent;
class ThreadTask implements Runnable {
String taskName;
public ThreadTask(String taskName) {
this.taskName = taskName;
}
public void run() {
System.out.println(Thread.currentThread()+" 正在执行 "+taskName);
try {
//随便睡一会,领导叫了再去干活!
Thread.sleep((long)(Math.random()*10000));
} catch (InterruptedException e) {
System.out.println("任务"+taskName+"被异常终止");
}
System.out.println("任务"+taskName+"被正常执行完毕");
}
}
线程池状态检测:每隔1000ms左右打印一次检测信息到控制台
package concurrent;
import java.util.concurrent.ThreadPoolExecutor;
class ThreadPoolCheck implements Runnable {
ThreadPoolExecutor executor;
public ThreadPoolCheck(ThreadPoolExecutor executor) {
this.executor=executor;
}
private void showPoolInfo(ThreadPoolExecutor executor,int count){
System.out.println("=========开始第"+count+"次检测===========");
System.out.println("已经执行完成的任务数目:"+executor.getCompletedTaskCount());
System.out.println("队列中等待执行的任务数目:"+executor.getQueue().size());
System.out.println("线程池中核心线程数:"+executor.getCorePoolSize());
System.out.println("线程池中活跃线程数目:"+executor.getActiveCount());
System.out.println("线程池中允许的最大线程数目:"+executor.getMaximumPoolSize());
System.out.println("=========完成第"+count+"次检测===========");
}
public void run() {
int count=0;
while(true){
count++;
try {
//睡一下,再继续工作吧!
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
showPoolInfo(executor,count);
//线程池都死了,我也不独活了!
if(executor.isTerminated()){
break;
}
}
}
}
主线程:创建线程池、线程任务
package concurrent;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolEx {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,200,TimeUnit.MILLISECONDS,new ArrayBlockingQueue(5),new ThreadPoolExecutor.CallerRunsPolicy());//创建线程池
new Thread(new ThreadPoolCheck(executor)).start();//先额外启动一个线程,检测线程池的状态
executor.prestartAllCoreThreads();//提前启动线程池所有核心线程
for(int i=0;i<20;i++) {
//创建20个线程任务,至少任务15个肯定由线程池中的线程执行(最大线程数+任务队列中的任务数)
//剩下的任务,由主线程(采取CallerRunsPolicy策略)执行
ThreadTask threadTask = new ThreadTask("threadtask-"+i);
executor.execute(threadTask);//执行线程任务
}
if (!executor.isShutdown()) {
executor.shutdown();//关闭线程池
}
}
}
一次运行结果打印的信息如下:
可以看到有2个任务不是由线程池中的线程执行的,而是由主线程执行的,是因为我采取了CallerRunsPolicy策略。总共创建了20个任务,但线程池中的线程只执行了其中18个任务。
Thread[pool-1-thread-2,5,main] 正在执行 threadtask-1 Thread[pool-1-thread-7,5,main] 正在执行 threadtask-7 Thread[main,5,main] 正在执行 threadtask-15 Thread[pool-1-thread-6,5,main] 正在执行 threadtask-5 Thread[pool-1-thread-10,5,main] 正在执行 threadtask-14 Thread[pool-1-thread-8,5,main] 正在执行 threadtask-8 Thread[pool-1-thread-1,5,main] 正在执行 threadtask-0 Thread[pool-1-thread-5,5,main] 正在执行 threadtask-4 Thread[pool-1-thread-4,5,main] 正在执行 threadtask-3 Thread[pool-1-thread-3,5,main] 正在执行 threadtask-2 Thread[pool-1-thread-9,5,main] 正在执行 threadtask-10 任务threadtask-3被正常执行完毕 Thread[pool-1-thread-4,5,main] 正在执行 threadtask-6 =========开始第1次检测=========== 已经执行完成的任务数目:1 队列中等待执行的任务数目:4 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第1次检测=========== 任务threadtask-6被正常执行完毕 Thread[pool-1-thread-4,5,main] 正在执行 threadtask-9 任务threadtask-15被正常执行完毕 Thread[main,5,main] 正在执行 threadtask-18 任务threadtask-7被正常执行完毕 Thread[pool-1-thread-7,5,main] 正在执行 threadtask-11 =========开始第2次检测=========== 已经执行完成的任务数目:3 队列中等待执行的任务数目:4 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第2次检测=========== 任务threadtask-4被正常执行完毕 Thread[pool-1-thread-5,5,main] 正在执行 threadtask-12 任务threadtask-0被正常执行完毕 Thread[pool-1-thread-1,5,main] 正在执行 threadtask-13 任务threadtask-8被正常执行完毕 Thread[pool-1-thread-8,5,main] 正在执行 threadtask-16 =========开始第3次检测=========== 已经执行完成的任务数目:6 队列中等待执行的任务数目:1 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第3次检测=========== =========开始第4次检测=========== 已经执行完成的任务数目:6 队列中等待执行的任务数目:1 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第4次检测=========== 任务threadtask-18被正常执行完毕 =========开始第5次检测=========== 已经执行完成的任务数目:6 队列中等待执行的任务数目:2 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第5次检测=========== =========开始第6次检测=========== 已经执行完成的任务数目:6 队列中等待执行的任务数目:2 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第6次检测=========== 任务threadtask-11被正常执行完毕 Thread[pool-1-thread-7,5,main] 正在执行 threadtask-17 任务threadtask-1被正常执行完毕 Thread[pool-1-thread-2,5,main] 正在执行 threadtask-19 =========开始第7次检测=========== 已经执行完成的任务数目:8 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:10 线程池中允许的最大线程数目:10 =========完成第7次检测=========== 任务threadtask-2被正常执行完毕 任务threadtask-9被正常执行完毕 任务threadtask-10被正常执行完毕 =========开始第8次检测=========== 已经执行完成的任务数目:11 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:7 线程池中允许的最大线程数目:10 =========完成第8次检测=========== 任务threadtask-13被正常执行完毕 任务threadtask-14被正常执行完毕 任务threadtask-16被正常执行完毕 =========开始第9次检测=========== 已经执行完成的任务数目:14 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:4 线程池中允许的最大线程数目:10 =========完成第9次检测=========== 任务threadtask-5被正常执行完毕 =========开始第10次检测=========== 已经执行完成的任务数目:15 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:3 线程池中允许的最大线程数目:10 =========完成第10次检测=========== =========开始第11次检测=========== 已经执行完成的任务数目:15 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:3 线程池中允许的最大线程数目:10 =========完成第11次检测=========== =========开始第12次检测=========== 已经执行完成的任务数目:15 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:3 线程池中允许的最大线程数目:10 =========完成第12次检测=========== 任务threadtask-12被正常执行完毕 =========开始第13次检测=========== 已经执行完成的任务数目:16 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:2 线程池中允许的最大线程数目:10 =========完成第13次检测=========== 任务threadtask-19被正常执行完毕 =========开始第14次检测=========== 已经执行完成的任务数目:17 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:1 线程池中允许的最大线程数目:10 =========完成第14次检测=========== 任务threadtask-17被正常执行完毕 =========开始第15次检测=========== 已经执行完成的任务数目:18 队列中等待执行的任务数目:0 线程池中核心线程数:5 线程池中活跃线程数目:0 线程池中允许的最大线程数目:10 =========完成第15次检测===========



