JCU-线程池

thread.getId()是当前执行线程的ID,每个线程有自己的ID,当一个线程执行完被销毁后,它拥有的ID会被重新分配给其他线程。

内存

  1. 线程池中维护一定数量的线程,进行重复利用。(减少创建、启动、销毁线程的开销)
  2. 线程从任务队列中取任务执行
    JCU-线程池_第1张图片

Java中的线程池

工具类Executors:
JCU-线程池_第2张图片

工具类Executors中方法

创建固定线程数的线程池

JCU-线程池_第3张图片

创建有调度功能的线程池

有执行时间、频率的调度(类似定时器Timer)
JCU-线程池_第4张图片

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) (同于Timer的schedule()作业调度)
JCU-线程池_第5张图片

scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)(这个是在任务执行结束后才进行计时delay,与scheduleAtFixedRate()不同)
JCU-线程池_第6张图片

核心线程池的底层实现

Executors工具类中的newCachedThreadPool(),newSingleThreadExcecutor(),newFixedThreadPool()底层源码都由ThreadPoolExecutor类实现

JCU-线程池_第7张图片

接口BlockingQueue < E >

这些都在java.util.concurrent包下有实现类,用的时候直接new类对象就可以。
JCU-线程池_第8张图片

Executors工具类中的newCachedThreadPool(),newSingleThreadExcecutor(),newFixedThreadPool():
JCU-线程池_第9张图片

接口RejectedExecutionHandler

这几大策略都在ThreadPoolExecutor中有静态实现的内部类(其中AbortPolicy是默认类)用的时候直接new内部类对象就可以
JCU-线程池_第10张图片

接口ThreadFactory

线程池中的线程是由ThreadFactory创建的, 在Executors中实现了下面两个内部类 :
JCU-线程池_第11张图片

总结

我们只需做到最基本的以下三点:

  1. 创建线程池:ExecutorService executorService = Executors.new…();
  2. 创建任务:Runnable r = new Runnable(){ run()…任务…}
  3. 将任务提交给线程池就可以了:executorService.submit( r );或executorService.execute( r );

自定义线程池

JCU-线程池_第12张图片


监控线程池

JCU-线程池_第13张图片

扩展线程池

JCU-线程池_第14张图片

JCU-线程池_第15张图片

JCU-线程池_第16张图片

JCU-线程池_第17张图片

线程池中异常

JCU-线程池_第18张图片

你可能感兴趣的:(java进阶,多线程,java,并发编程)