美文网首页
java多线程(核心篇)第八章

java多线程(核心篇)第八章

作者: jiahzhon | 来源:发表于2020-01-07 00:08 被阅读0次

第八章 线程管理

8.1 线程组
  1. java平台中的任何一个线程都有一个线程组与之有关联,这个线程组可以通过Thread.getThreadGroup()调用来获取。
  2. uncaughtExceptionHandler——处理run抛出未捕获的异常。
8.2 线程工厂
  1. 线程工厂XThreadFactory的newThread方法为其创建的每一个线程做了这样一些处理逻辑:为线程关联uncaughtExceptionHandler,为线程设置一个含义更加具体的有助于问题定位的名称,确保线程是一个用户线程,确保线程的优先级为正常级别,以及在线程创建的时候打印相关的日志信息等。
8.3 线程池
  1. 常见的对象池(比如数据库连接池)的实现方式是对象池(本身也是个对象)内部维护一定数量的对象,客户端代码需要一个对象的时候就向对象池申请(借用)一个对象,用完之后再将该对象返还给对象池,于是对象池中的一个对象就可以先后为多个客户端线程服务。
  2. 客户端代码并不需要向线程池借用线程而是将其需要执行的任务作为一个对象提交给线程池,线程池可能将这些任务缓存再队列(工作队列)之中,而线程池内部的各个工作者线程则不断地从队列中取出任务并执行之。
  3. 客户端代码提交给线程池的任务相当于“产品”,线程池内部用于缓存任务的队列相当于传输通道。


    image.png
  4. java.util.concurrent.ThreadPoolExecutor类就是一个线程池,客户端代码可以调用ThreadPoolExecutor.submit方法向其提交任务。
  5. 线程池内部维护的工作者线程的数量就被称为该线程池的线程池大小。ThreadPoolExecutor的线程池大小有3种形态:当前线程池大小(Current Pool Size)表示线程池种实际工作者线程的数量:最大线程池大小(Maximum Pool Size)表示线程池中允许存在的工作者线程的数量上限。核心线程大小(Core Pool Size)表示一个不大于最大线程池大小的工作者线程数量上限。


    image.png
  6. workQueue是被称为工作队列的阻塞队列,它相当于生产者-消费者模式中的传输通道,corePoolSize用于指定线程池核心大小,maximumPoolSize用于指定最大线程池大小。KeepAliveTime和Unit合在一起用于指定线程池中空闲线程的最大存活时间。threadFactory指定用于创建工作者线程的线程工厂。
  7. 当当前线程池大小达到核心线程池大小的时候,新来的任务会被存入工作队列之中。
  8. 线程池将任务存入工作队列的时候调用的是BlockingQueue的非阻塞方法offer(E e),因此工作队列满并不会使提交任务的客户端线程暂停。当工作队列满的时候,线程池会继续创建新的工作者线程,直到当前线程池大小达到最大线程池大小。
  9. 当前线程池大小达到最大线程池大小的情况下,客户端试图提交的任务会被拒绝。
  10. 超过线程池核心大小部分的工作者线程空闲(即工作者队列中没有待处理的任务)时间达到keepAliveTime所指定的时间后就会被清理掉,即这些工作者线程会自动终止并被从线程池中移除。
  11. 如果客户端关心任务的处理结果,那么它可以使用ThreadPoolExecutor的另外一个submit方法来提交任务。Public <T> Future<T> submit(Callable<T> task)
  12. Callable接口也是对任务的抽象:任务的处理逻辑可以在Callable接口实现类的call方法中实现。Callable接口相当于一个增强型的Runnable接口:call方法的返回值代表相应任务的处理结果。
  13. submit方法的返回值类型为java.util.concurrent.Future。Future接口实例可被看作提交给线程池执行的任务的处理结果句柄。

相关文章

网友评论

      本文标题:java多线程(核心篇)第八章

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