线程池
概述
Solpic
提供了线程池接口ThreadPool
(线程池,支持异步提交任务和任务结果监听)或者ScheduledThreadPool
(调度线程池,支持提交指定未来某个时刻执行或者按照固定时间间隔的任务)定义和对应的内置实现,可以通过SPI
增强模块直接加载对应的线程池单例使用。
使用线程池
加载线程池单例:
java
// 加载ThreadPool
ThreadPool tp1 = SpiLoader.getSpiLoader(ThreadPool.class).getDefaultService();
ThreadPool tp2 = SpiLoader.getSpiLoader(ThreadPool.class).getService("common");
ThreadPool tp3 = SpiLoader.getSpiLoader(ThreadPool.class).getService("virtual");
// 加载ScheduledThreadPool
ScheduledThreadPool scheduledThreadPool = SpiLoader.getSpiLoader(ScheduledThreadPool.class).getDefaultService();
使用ThreadPool
的一个简单例子如下:
java
threadPool.execute(() -> System.out.println("foo"));
Future<String> future = threadPool.submit(() -> "bar");
String result = future.get();
ThreadPool
目前提供三种内置实现:
common
:底层线程池来源于ForkJoinPool#commonPool()
default
:最小和最大线程数固定为Runtime#availableProcessors()
任务队列为无界阻塞队列的线程池virtual
:基于虚拟线程实现,每个提交的任务都使用全新的虚拟线程执行,要求JDK>=21
ThreadPool
也支持监听任务执行结果,这种回调模式在某些场景下会比直接调用更加灵活:
java
ThreadPool threadPool = SpiLoader.getSpiLoader(ThreadPool.class).getDefaultService();
threadPool.submit(() -> "hello", new AbstractFutureListener<>() {
@Override
public void onSuccess(String result) {
System.out.printf("onSuccess: %s\n", result);
}
});
Thread.sleep(100);
使用ScheduledThreadPool
的一个简单例子如下:
java
scheduledThreadPool.schedule(() -> "hello", 5, TimeUnit.SECONDS);
scheduledThreadPool.scheduleWithFixedDelay(() -> System.out.println("world"), 0, 5, TimeUnit.SECONDS);