Skip to content

线程池

概述

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);

贡献者

页面历史

Released under the MIT License.