java 线程池

ThreadPoolExecutor
Executer 静态方法可以

  • newFixedThreadPool可以生成固定大小的线程池;
  • newCachedThreadPool可以生成一个无界、可以自动回收的线程池;
  • newSingleThreadScheduledExecutor可以生成一个单个线程的线程池;
  • newScheduledThreadPool还可以生成支持周期任务的线程池。
    也可以new一个ThreadPoolExecutor

我们基本只要使用这个执行器就行了,可以设置或获取配置信息,比如多大啊,等多久啊,用什么队列实现啊
或者对这个执行器扩展一下,自己new一个,还以用来处理自己任务前干啥,任务后干啥。

submit可以返回任务执行结果
submit里会调用execute
或者直接你也可以execute 添加任务
如果线程<corePoolSize 会创建线程,去执行任务,毕竟不用白不用,线程不能留着空
否则看workQueue队列是否满了,没满加到队列里等,因为线程够多了,先等等
若果workQueue也满了,线程数量<maximumPoolSize,因为队列满了,但是任务还是要做,所以还是会创建线程去执行任务
如果线程数到允许上限了,就会返回失败了。。。

然后当线程数不足corePoolSize的时候keepAliveTime,没用会一直等任务,因为反正可以让其它线程去干想干的事情
如果线程够corePoolSize了getTask()的时候,不会一直等,只会等keepAliveTime的时间,没任务,就算超时了,去干下一件事

可以用shutdown(),等任务都弄完了,关掉线程池,用了shutdown就不能加任务了
用shutdownNow(),就不会等任务做完,就直接关线程池了
waitTermination()会阻塞的等指定时间,返回任务完成没,不会做什么实际的事情,不会关线程池,也可以接着添加任务

还有几种队列
  ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
  LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
  SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
  PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。
RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略。
  AbortPolicy:直接抛出异常。
  CallerRunsPolicy:只用调用者所在线程来运行任务。
  DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
  DiscardPolicy:不处理,丢弃掉。
  当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。

原文地址:https://www.cnblogs.com/HaibaraAi/p/6538320.html