线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制线程的数量,避免大量线程之间的切换导致的性能开销。
Java中的线程池主要由以下几个部分组成:
核心线程数(corePoolSize):线程池中始终保持的线程数量。如果线程池中的线程数量小于核心线程数,即使有空闲线程,也不会被销毁。
最大线程数(maximumPoolSize):线程池中允许的最大线程数量。当工作队列满了之后,线程池会创建新的线程来处理任务,直到达到最大线程数。
工作队列(workQueue):用于存储等待执行的任务。有几种类型的工作队列,如ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等,它们具有不同的特性和适用场景。
拒绝策略(rejectedExecutionHandler):当工作队列满了且线程数达到最大值时,新来的任务如何处理。常见的拒绝策略有AbortPolicy(直接抛出异常)、CallerRunsPolicy(调用者执行任务)、DiscardOldestPolicy(丢弃队列中最旧的任务)等。
线程工厂(ThreadFactory):用于创建新线程的工厂。可以自定义线程的名称、优先级等属性。
拒绝策略(handler):当工作队列满了且线程数达到最大值时,新来的任务如何处理。常见的拒绝策略有AbortPolicy(直接抛出异常)、CallerRunsPolicy(调用者执行任务)、DiscardOldestPolicy(丢弃队列中最旧的任务)等。
以下是一个简单的Java线程池示例:
在这个例子中,我们创建了一个固定大小为5的线程池,然后提交了10个任务到线程池。线程池会自动分配线程来执行这些任务。当所有任务完成后,我们关闭线程池。