Java线程池示例
package cn.stydy;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;
public class ThreadPoolTest {
private static ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build();
private static ThreadPoolExecutor executorService = new ThreadPoolExecutor(2, 20, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), threadFactory, new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) {
for (int i = 1; i <= 15; i++) { //创建15个任务
executorService.execute(new Task("第" + i + "个任务"));
}
// 关闭线程池
executorService.shutdown();
}
private static void printThreadPoolStatus(ThreadPoolExecutor executor) {
BlockingQueue queue = executor.getQueue();
System.out.println(Thread.currentThread().getName() + ":" +
"当前的线程数量:" + executor.getPoolSize() + "," +
"核心线程数:" + executor.getCorePoolSize() + "," +
"最大线程数:" + executor.getMaximumPoolSize() + "," +
"活动线程数:" + executor.getActiveCount() + "," +
"任务总数:" + executor.getTaskCount() + "," +
"任务完成数:" + executor.getCompletedTaskCount() + "," +
"线程空闲时间:" + executor.getKeepAliveTime(TimeUnit.SECONDS) + "秒," +
"当前排队线程数:" + queue.size() + "," +
"队列剩余大小:" + queue.remainingCapacity() + "," +
"线程池是否关闭:" + executor.isShutdown() + ","
);
}
static class Task implements Runnable {
String taskName;
Task(String name) {
taskName = name;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ",任务名:" + taskName + ",线程启动");
try {
for (int i = 30; i > 0; i--) {
System.out.println(Thread.currentThread().getName() + ":" + i);
printThreadPoolStatus(executorService);
Thread.sleep(500); //线程休眠0.5s
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + ":线程阻塞");
}
System.out.println(Thread.currentThread().getName() + ":线程结束");
}
}
}
线程池核心线程数:2,最大线程数:20,任务队列长度:10;
以上代码创建了15个线程任务,代码运行后两个核心线程会先执行第1、2个任务,第3-12个任务会进入任务队列等待执行,此时核心线程被全部使用,任务队列也满了,但线程池中运行的线程数量未达到设置的最大线程数20,所以线程池会再创建新的线程去执行后面的第13、14、15个任务,此时线程池中同时运行的线程有5个,这5个线程在执行完自己的任务后会进入空闲状态由线程池从任务队列重新分配任务给空闲线程去执行,直到所有任务都被执行完,所以线程池一共创建了5个线程
控制台输出: