方便理线程池最最核心的逻辑
1. 线程池类
package com.gzz;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ThreadPool {
// 阻塞队列
private BlockingQueue<Runnable> blockQueue;
// 线程集合
private Set<WorkThread> threads;
public ThreadPool(int threadCount, int queueSize) {
blockQueue = new ArrayBlockingQueue<>(queueSize);
threads = new HashSet<>(threadCount);
// 初始化线程
for (int i = 0; i < threadCount; i++) {
WorkThread thread = new WorkThread("Thread" + i);
threads.add(thread);
thread.start();
}
}
/**
* 向线程池提交任务
*/
public void execute(Runnable task) {
try {
blockQueue.put(task);
} catch (InterruptedException e) {
System.out.println("提交任务时被中断,提交任务失败!");
}
}
/**
* 关闭线程池
*/
public void shutdown() {
for (WorkThread workThread : threads) {
workThread.close();
workThread = null; // help GC
}
threads.clear();
}
/**
* 工作线程
*/
class WorkThread extends Thread {
public WorkThread(String name) {
super();
setName(name);
}
@Override
public void run() {
// 不断地从阻塞队列中获取任务然后执行
while (!isInterrupted()) {
try {
Runnable take = blockQueue.take();
if (take != null) {
take.run();
}
// take = null; // help GC
} catch (InterruptedException e) {
close();
log.info("获取任务时被中断!");
}
}
}
public void close() {
this.interrupt();
}
}
}
2. 测试类
package com.gzz;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ThreadPoolMain {
public static void main(String[] args) throws InterruptedException {
ThreadPool threadPool = new ThreadPool(3, 5);
// 向线程池中提交100个任务
for (int i = 0; i < 10; i++) {
threadPool.execute(() -> log.info(Thread.currentThread().getName() + ":Hello World!"));
}
Thread.sleep(2000);
threadPool.shutdown();
}
}
3 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gzz</groupId>
<artifactId>11-rpc-server</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
网友评论