用java自定义一个可缓存线程池
时间: 2024-05-12 12:19:46 浏览: 20
以下是一个自定义的可缓存线程池的Java代码示例:
```
import java.util.concurrent.*;
public class CustomThreadPool {
private ThreadPoolExecutor executor;
public CustomThreadPool() {
int corePoolSize = 0;
int maximumPoolSize = 10;
long keepAliveTime = 60L;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new SynchronousQueue<>();
executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public void execute(Runnable task) {
executor.execute(task);
}
public void shutdown() {
executor.shutdown();
}
}
```
在这个例子中,我们使用了Java内置的ThreadPoolExecutor类来创建线程池。这个线程池的特点是:
- 初始线程数为0,最大线程数为10,空闲线程超过60秒就会被回收
- 使用SynchronousQueue作为任务队列,这个队列没有容量限制,每个插入操作都必须等待一个相应的删除操作,因此任务会立即被提交到线程池中执行
我们还定义了两个方法,execute和shutdown。execute方法接受一个Runnable任务并将其提交给线程池执行,shutdown方法关闭线程池。使用这个线程池的示例代码如下:
```
public static void main(String[] args) {
CustomThreadPool threadPool = new CustomThreadPool();
for (int i = 0; i < 20; i++) {
final int taskNum = i;
threadPool.execute(() -> {
System.out.println("Task " + taskNum + " is running.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + taskNum + " is completed.");
});
}
threadPool.shutdown();
}
```
这个示例代码创建了一个CustomThreadPool对象,然后提交了20个任务给线程池执行。每个任务都会打印出自己的编号,然后等待1秒钟,最后打印出自己完成。注意,在最后一行代码中,我们调用了shutdown方法来关闭线程池,确保程序能够正常退出。