java线程池的使用

1.如果线程池中的线程小于核心线程,新加入的线程对象默认会开启新的线程,直到超过核心线程

2.如果好过了核心线程就会先将线程对象放在队列中,队列里面放不下了,且核心线程数小于最大线程数,就会开启新的线程来执行线程对象

3.如果后两者都满了,则拒绝任务,抛出异常


1.newFixedThreadPool(int nThreads)

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
创建固定大小的线程池,corePoolSize和maxinumPoolSize都设置为相同大小,大于核心线程的空余线程等待的事件为0秒,队列为Integer.MAX_VALUE大小的队列(可视为无界队列)。

假设参数设置的线程数为5,由于设置的队列为无界队列,所以设置的maxinumPoolSize是没有意义的,因为超过核心线程数的线程对象会存放在队列中,所以永远不会用到最大线程数

2.newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
创建单一线程的线程池,由于使用无界队列,maxinumPoolSize无效,就是单一线程执行串行任务。这就相当于newFixedThreadPool(1)。

3.newCachedThreadPool()

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
核心线程数为0,最大线程数为Integer.MAX_VALUE,相当于无界,由于使用的是直接提交的队列,加入队列前会判断该队列中是否有任务,有就会加入队列失败,会先寻找空余线程来执行,如果没有空余线程就创建新的线程执行任务。这样感觉这个队列没什么作用,就相当于没有空余进程就创建新的进程,否则加入空余进程。

注意:在使用SynchronousQueue通常要求maximumPoolSize是无界的,如果是有界,由于SynchronousQueue只能存放一个会很容易达到最大线程数,就会抛异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值