Java中的线程池是一种常见的线程管理机制,将任务分配给线程池,可以提高程序的执行效率和资源利用率。在使用线程池时,可以通过设置不同的参数来控制线程池的行为,下面是Java线程池7个参数的详细含义:
-
corePoolSize:设置线程池的核心线程数量。当提交的任务数小于等于核心线程数量时,线程池中的指定数量的线程会被立即创建并执行任务。如果所有核心线程都在执行任务,则新提交的任务会被存储在队列中等待执行。注意:即使有闲置的核心线程,线程池也可以创建新线程(直到达到最大线程数量)。
-
maximumPoolSize:设置线程池的最大线程数量。当队列已满且所有的核心线程都在执行任务时,线程池才会创建新线程,直到创建的线程数达到指定的最大线程数。当达到最大线程数时,新提交的任务会被拒绝,并且以拒绝策略进行处理。
-
keepAliveTime:当线程池中的线程数量大于核心线程数时,多余的线程将在空闲一段时间后被销毁。这个时间就是 keepAliveTime,可以通过 setKeepAliveTime 方法设置。注意:在执行这一策略时,如果现有线程的数量不超过 corePoolSize,keepAliveTime 不会生效。
-
TimeUnit:keepAliveTime 的时间单位,有 TimeUnit.SECONDS、TimeUnit.MILLISECONDS、TimeUnit.MINUTES 等。
-
workQueue:任务队列,用于在核心线程池和最大线程池之间存储等待执行的任务。常见的工作队列有:SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue 等。
-
threadFactory:线程工厂,用于创建线程。可以通过实现 ThreadFactory 接口来自定义线程的创建方式。
-
handler:拒绝策略,当线程池的队列已满且所有线程都在执行任务时,新提交的任务会被拒绝并以拒绝策略进行处理。常见的拒绝策略有:AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy 等。
下面是两条示例说明:
示例一:使用 LinkedBlockingQueue 这个无界队列作为任务队列
ThreadPoolExecutor executor = new ThreadPoolExecutor(
3, //corePoolSize
5, //maximumPoolSize
10, //keepAliveTime
TimeUnit.SECONDS, //keepAliveTime的时间单位
new LinkedBlockingQueue<>(), //workQueue
Executors.defaultThreadFactory(), //threadFactory
new ThreadPoolExecutor.AbortPolicy() //handler
);
这个例子中,线程池的核心线程数是3,最大线程数是5,线程池中可以存在最多5个活跃的线程;当线程池中的活跃线程数超过了3个,用于执行任务的线程就会被放入队列中等待执行。队列使用了 LinkedBlockingQueue 这种无界队列,意味着队列的容量是无限大的,所以不会被拒绝策略拒绝掉。
示例二:通过实现 ThreadFactory 接口来创建线程
class MyThreadFactory implements ThreadFactory {
private int counter = 1;
private String prefix = "";
public MyThreadFactory(String prefix) {
this.prefix = prefix;
}
public Thread newThread(Runnable r) {
return new Thread(r, prefix + "-" + counter++);
}
}
ThreadPoolExecutor executor = new ThreadPoolExecutor(
3, //corePoolSize
5, //maximumPoolSize
10, //keepAliveTime
TimeUnit.SECONDS, //keepAliveTime的时间单位
new ArrayBlockingQueue<>(3), //workQueue
new MyThreadFactory("myThread"), //自定义的线程工厂
new ThreadPoolExecutor.AbortPolicy() //handler
);
这个例子中,我们通过实现 ThreadFactory 接口来自定义线程的创建方式。我们先创建了一个 MyThreadFactory 类,这个类实现了 ThreadFactory 接口,并重写了 newThread 方法,用于创建一个新的线程。我们在线程的名字中设置了一个前缀,然后在 newThread 方法中使用这个前缀和一个计数器来生成线程名字,从而使线程名字更具可读性。最后,我们将这个自定义的线程工厂传递给了线程池的构造函数,让他来创建线程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程池7个参数的详细含义 - Python技术站