线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这其中涉及到了很多的参数问题,下面我们就统一地讲一下线程池的参数问题。
任务队列是基于阻塞队列实现的,即采用生产者消费者模式,在Java中需要实现BlockingQueue接口。但Java已经为我们提供了7种阻塞队列的实现:
注意有界队列和无界队列的区别:如果使用有界队列,当队列饱和时并超过最大线程数时就会执行拒绝策略;而如果使用无界队列,因为任务队列永远都可以添加任务,所以设置maximumPoolSize没有任何意义。
线程工厂指定创建线程的方式,需要实现ThreadFactory接口,并实现**newThread(Runnable r)**方法。该参数可以不用指定,Executors框架已经为我们实现了一个默认的线程工厂:
/** * The default thread factory.
*/private static class DefaultThreadFactory implements ThreadFactory
{
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
DefaultThreadFactory()
{
SecurityManager s = System.getSecurityManager();
group = (s != null) ?
s.getThreadGroup() : Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() + "-thread-";
}
public Thread newThread(Runnable r)
{
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon())
t.setDaemon(false);
if(t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t; }
}
当线程池的线程数达到最大线程数时,需要执行拒绝策略。拒绝策略需要实现RejectedExecutionHandler接口,并实现**rejectedExecution(Runnable r, ThreadPoolExecutor executor)**方法。不过Executors框架已经为我们实现了4种拒绝策略:
线程池中需要我们记忆的参数数据其实不多,我们只要重点掌握上述的几个参数就足够了,至于想深入学习线程池中的各种类型的参数的小伙伴可以通过查阅资料或者观看动力节点在线的视频课程获取更多的信息。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54