【973、线程池,默认的几种队列,Java的几个默认线程池】

304 阅读2分钟

Java中的线程池通过Executor框架来实现。在java.util.concurrent包中,有几个默认的线程池实现,它们使用不同的队列来管理等待执行的任务。以下是Java中几个常见的线程池以及它们的默认队列:

  1. newCachedThreadPool

    • 这是一个可根据需要创建新线程的线程池。如果现有线程没有可用的时候,它将创建一个新线程,并在之后的60秒内重用这个线程。
    • 默认队列:SynchronousQueue,一个不存储元素的队列,每个插入操作必须等待一个相应的删除操作。
    ExecutorService executor = Executors.newCachedThreadPool();
    
  2. newFixedThreadPool(int nThreads)

    • 创建一个固定大小的线程池,其中线程数量始终为 nThreads
    • 默认队列:LinkedBlockingQueue,一个无界队列,可以存储无限多个任务。
    ExecutorService executor = Executors.newFixedThreadPool(10);
    
  3. newSingleThreadExecutor

    • 创建一个只有一个线程的线程池,任务将按照它们被提交的顺序执行。
    • 默认队列:LinkedBlockingQueue
    ExecutorService executor = Executors.newSingleThreadExecutor();
    
  4. newScheduledThreadPool(int corePoolSize)

    • 创建一个定时执行任务的线程池。
    • 默认队列:ScheduledThreadPoolExecutor内部使用了DelayedWorkQueue,一个按照任务的延迟时间排序的队列。
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
    
  5. newWorkStealingPool

    • 创建一个工作窃取线程池,每个线程都有一个自己的工作队列,如果一个线程完成了自己队列中的任务,它可以从其他线程的队列中窃取任务执行。
    • 默认队列:BlockingDeque,使用双端队列来存储任务。
    ExecutorService executor = Executors.newWorkStealingPool();
    

这些线程池都实现了ExecutorService接口,提供了一种方便的方式来执行异步任务。你可以选择合适的线程池和队列类型,根据你的应用程序需求进行配置。在实际应用中,通常需要根据具体情况调整线程池的大小、队列的容量等参数,以避免资源浪费和性能问题。