美文网首页
线程池-7

线程池-7

作者: 01010100 | 来源:发表于2018-04-20 11:35 被阅读6次

2.4理解ThreadPoolExecutor源码之后,再来看看线程池的使用,http://fangjian0423.github.io/2015/07/24/java-poolthread/

Executors这个帮助类提供了大概有以下几个方法:

newFixedThreadPool

newSingleThreadExecutor

newCachedThreadPool

newScheduledThreadPool

newSingleThreadScheduledExecutor

其实调用的还是ThreadPoolExecutor具体实现类,其构造方法的参数在上述已经有详述。

2.4.1newFixedThreadPool(int

nThreads)= new ThreadPoolExecutor(nThreads, nThreads, 0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue());

顾名思义,创建一个固定大小的线程池。所以其corePoolSize=maximumPoolSize= nThreads,

keepAliveTime=0L则线程空闲不会被回收。

阻塞队列是LinkedBlockingQueue,LinkedBlockingQueue是一个用链表实现的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。

2.4.2newSingleThreadExecutor()= new FinalizableDelegatedExecutorService(

new ThreadPoolExecutor(1, 1,0L,

TimeUnit.MILLISECONDS,

new LinkedBlockingQueue()));

FinalizableDelegatedExecutorService是个委托类,重载了finalize() {super.shutdown();},即第一次调finalize的时候会执行shutdown。里面其实创建的就是ThreadPoolExecutor。

corePoolSize=maximumPoolSize= 1,keepAliveTime=0L则线程空闲也不会被回收。阻塞队列同上,也是LinkedBlockingQueue。

2.4.3newCachedThreadPool()

= new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, newSynchronousQueue())

corePoolSize=0,maximumPoolSize = Integer.MAX_VALUE,keepAliveTime=60L即线程空闲状态下最多保持60秒

阻塞队列是SynchronousQueue,SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。SynchronousQueue可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue 和 ArrayBlockingQueue。

2.4.4

newScheduledThreadPool(int corePoolSize) = new

ScheduledThreadPoolExecutor(corePoolSize);

= super(corePoolSize, Integer.MAX_VALUE, 0,

TimeUnit.NANOSECONDS, new DelayedWorkQueue());

corePoolSize= corePoolSize,maximumPoolSize = Integer.MAX_VALUE,keepAliveTime=0L空闲也不会被回收

阻塞队列是DelayedWorkQueue延时队列。

这个方法返回的是ScheduledExecutorService,ScheduledExecutorService是基于调度的线程池

启动调的是schedule(Runnable

command, long delay, TimeUnit unit),可以传延时时间,延时执行。最常用的调度方法 ScheduleAtFixedRate 和 ScheduleWithFixedDelay

ScheduleAtFixedRate:固定频率执行,如固定频率4秒执行一次,不管上次有没有执行,每隔4秒就执行

ScheduleWithFixedDelay:固定延迟执行,等待上一次任务执行完之后,延迟4秒再执行下一个任务。

Lock、LockSupport:

http://coderbee.net/index.php/concurrent/20131115/577

http://hovertree.com/h/bjaf/13wv7sxh.htm

http://ifeve.com/introduce-abstractqueuedsynchronizer/

AQS:源码参见以下两个链接,讲的非常清晰明了

http://www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer独占锁:ReentrantLock

http://www.infoq.com/cn/articles/java8-abstractqueuedsynchronizer共享锁:CountDownLatch

http://www.cnblogs.com/zhanjindong/p/java-concurrent-package-aqs-AbstractQueuedSynchronizer.html

相关文章

  • 线程池

    1、为什么要使用线程池2、线程池的工作原理3、线程池参数4、阻塞队列5、饱和策略6、向线程池提交任务7、线程池的状...

  • 3分钟了解 java线程池ThreadPoolExecutor的

    常用的3个线程池 线程池的7个参数详解 1.corePoolSize:线程池中的常驻核心线程数2.maximumP...

  • 线程池-7

    2.4理解ThreadPoolExecutor源码之后,再来看看线程池的使用,http://fangjian042...

  • juc和多线程并发相关面试题

    线程池7大参数介绍 corePoolSize:线程池中的常驻核心线程数在创建了线程池后,当有请求任务来之后,就会安...

  • 线程池 死锁

    线程池 7个参数自定义

  • JUC线程池(7):线程池总结

    1、前言 之前被人问懵了,其实原理很简单: 任务被提交到线程池时,如果线程数小于 corePoolSize,先创建...

  • 掌握线程池7大核心参数,自己也可以手写线程池

    手写线程池只需了解7个线程池核心参数 参数名中文名说明corePoolSize核心线程数默认不会销毁,需要设置al...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • 一个例子理解java线程池 ThreadPoolExecutor

    创建一个线程池需要7个参数 corePoolSize 核心线程数量 maximumPoolSize 最大线程数量 ...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

网友评论

      本文标题:线程池-7

      本文链接:https://www.haomeiwen.com/subject/euyakftx.html