java.util.concurrent和工具类

一、java.util.concurrent体系的主要大板块包含内容

说到JUC其实就是说java的多线程等和锁及一些状态转换,中断等,它还涉及到一些tools工具的东东,见下图:

Tools也包含了5个部分的知识:Executors、Semaphor、Exchanger、CyclicBarrier、CountDownLatch,其实也就是五个工具类

 

 

 

二、Executors

它主要用来创建线程池,代理了线程池的创建,使得你的创建入口参数变得简单,通过方法名便知道了你要创建的线程池是什么样一个线程池,功能大概是什么样的,其实线程池内部都是统一的方法来实现,通过构造方法重载,使得实现不同的功能,但是往往这种方式很多时候不知道具体入口参数的改变有什么意思,除非读了源码才知道,此时builder模式的方式来完成,builder什么样的东西它告诉你就可以。

 

常见的方法有(都是静态方法):

 

1、创建一个指定大小的线程池,如果超过大小,放入blocken队列中,默认是LinkedBlockingQueue,默认的ThreadFactory为:Executors.defaultThreadFactory(),是一个Executors的一个内部类。

 

Executors.newFixedThreadPool(int)

内部实现如下:

public static ExecutorService newFixedThreadPool(int nThreads) { 

    return new ThreadPoolExecutor(nThreads, nThreads, 

                                  0L, TimeUnit.MILLISECONDS, 

                                  new LinkedBlockingQueue<Runnable>()); 

 

2、创建一个指定大小的线程池,如果超过大小,放入blocken队列中,默认是LinkedBlockingQueue,自己指定ThreadFactory,自己写的ThreadFactory,必须implements ThreadFactory,实现方法:newThread(Runnable)。

 

Executors.newFixedThreadPool(int,ThreadFactory)

 

内部实现是:

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { 

    return new ThreadPoolExecutor(nThreads, nThreads, 

                                  0L, TimeUnit.MILLISECONDS, 

                                  new LinkedBlockingQueue<Runnable>(), 

                                  threadFactory); 

 

3、创建线程池长度为1的,也就是只有一个长度的线程池,多余的必须等待,它和调用Executors.newFixedThreadPool(1)得到的结果一样:

 Executors.newSingleThreadExecutor()

 

内部实现是:

public static ExecutorService newSingleThreadExecutor() { 

    return new FinalizableDelegatedExecutorService 

        (new ThreadPoolExecutor(1, 1, 

                                0L, TimeUnit.MILLISECONDS, 

                                new LinkedBlockingQueue<Runnable>())); 

 

 

4、和方法3类似,可以自定义ThreadFactory,这里就不多说了!

 

5、创建可以进行缓存的线程池,默认缓存60s,数据会放在一个SynchronousQueue上,而不会进入blocken队列中,也就是只要有线程进来就直接进入调度,这个不推荐使用,因为容易出问题,除非用来模拟一些并发的测试:

 

Executors.newCachedThreadPool();

 

内部实现为:

public static ExecutorService newCachedThreadPool() { 

    return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 

                                  60L, TimeUnit.SECONDS, 

                                  new SynchronousQueue<Runnable>()); 

 

6、和方法5类似,增加自定义ThreadFactory

 

7、添加一个Schedule的调度器的线程池,默认只有一个调度:

 

Executors.newSingleThreadScheduledExecutor();

 

内部实现为(这里可以看到不是用ThreadPoolExector了,schedule换了一个类,内部实现通过ScheduledThreadPoolExecutor类里面的内部类ScheduledFutureTask来实现的,这个内部类是private,默认引用不到

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {  

    return new DelegatedScheduledExecutorService 

        (new ScheduledThreadPoolExecutor(1)); 

 

8、和7一样,增加自己定义的ThreadFactory

 

9、添加一个schedule的线程池调度器,和newFixedThreadPool有点类似:

 

Executors.newScheduledThreadPool();

内部代码为:

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { 

    return new ScheduledThreadPoolExecutor(corePoolSize); 

 

其实内部Exectors里面还有一些其他的方法,我们就不多说明了,另外通过这里,大家先可以了解一个大概,知道Exectors其实是一个工具类,提供一系列的静态方法,来完成对对应线程池的形象化创建

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值