线程池相关


上图为线程池的处理流程原理。



提交任务有两种,执行execute和sumbit有返回future对象
Executor:是Java线程池的顶级接口
Executors:是一个类,提供了不同的静态方法。用于生成不同类型的线程池。


ThreadPoolExecutor的七个参数:
1.核心线程池的大小
2.最大线程池的大小
3.线程大于核心线程时。空闲任务等待分配任务的最长时间
4.这个时间的度量单位
5.保存任务的工作队列 不同线程池使用不同的阻塞队列
6.线程工厂
7.饱和策略


Executors产生的几种线程池

1.固定大小的线程池 
newFixedThreadPool

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

2.单线程的线程池
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
3.大小可变无界的线程池
    public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>(),
                                      threadFactory);
    }

4.可延迟的线程池
    public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory) {
        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
              new DelayedWorkQueue(), threadFactory);
    }


J.U.C包中几种BlockingQueue队列:


1.ArrayBlockingQueue:
数组支持的有界队列,按照先进先出的顺序排列。需指定最大容量和是否为公平锁。不会自己扩容,默认非公平锁。


2.DelayQueue:ScheduledThreadPoolExecutor
是一个无界阻塞队列,只有延期满了才能从中提取元素。(支付项目)


3.LinkedBlockingDeque:

一个阻塞双端队列,可指定容量

4.LinkedBlockinQueue   newSingleThreadExecutor   newFixedThreadPool
一个基于链表的阻塞队列,吞吐量要低于ArrayBlockingQueue


5.PriorityBlockingQueue:
一个无界阻塞队列。逻辑上无界,资源耗尽 add也会失败 不允许null


6.sysnchronousQueue: newCachedThreadPool
一种阻塞队列,每个插入必须等待另一个线程对应的移除。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,线程池是一种管理和复用线程的机制,可以提高多线程程序的效率和性能。以下是几个与Java线程池相关的最佳实践: 1. 使用Executors类创建线程池:Java提供了Executors类来创建不同类型的线程池。根据实际需求选择适当的线程池类型,如FixedThreadPool、CachedThreadPool、SingleThreadExecutor等。 2. 控制线程池的大小:线程池的大小应根据系统资源和任务特性进行调整。如果任务是CPU密集型的,线程数应与CPU核心数相近;如果是IO密集型的,可以适当增加线程数。 3. 设置合适的队列容量:线程池中的任务队列用于存放待执行的任务。如果任务量大于线程池处理能力,队列容量应设置得足够大,以避免任务丢失或拒绝执行。 4. 使用合适的拒绝策略:当线程池无法处理新提交的任务时,可以使用合适的拒绝策略来处理。常见的拒绝策略包括AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy。 5. 谨慎使用无限线程池:CachedThreadPool是一个无限线程数的线程池,可以根据需要自动创建和回收线程。但过多的线程可能会导致系统负载过高,因此需要谨慎使用。 6. 使用合适的线程命名:为线程池中的线程设置有意义的名称,可以方便调试和日志记录。 7. 考虑任务的优先级:Java线程池支持设置任务的优先级。如果有任务需要优先执行,可以设置较高的优先级。 8. 及时关闭线程池:当不再需要线程池时,应及时关闭以释放资源。可以使用shutdown()方法平缓关闭线程池,或使用shutdownNow()方法立即关闭线程池。 以上是一些常见的Java线程池的最佳实践,根据具体场景和需求,可以进行适当调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值