事变机制:
- 提交使命
- 假如线程数少于焦点线程,建设焦点线程执利用命
- 假如线程数便是焦点线程,把使命添加到LinkedBlockingQueue阻塞行列
- 假如线程执行完使命,去阻塞行列取使命,继承执行。
实例代码
- ExecutorService executor = Executors.newFixedThreadPool(10);
- for (int i = 0; i < Integer.MAX_VALUE; i++) {
- executor.execute(()->{
- try {
- Thread.sleep(10000);
- } catch (InterruptedException e) {
- //do nothing
- }
- });
- 复制代码
IDE指定JVM参数:-Xmx8m -Xms8m :
run以上代码,会抛出OOM:
因此,口试题:行使无界行列的线程池会导致内存飙升吗?
谜底 :会的,newFixedThreadPool行使了无界的阻塞行列LinkedBlockingQueue,假如线程获取一个使命后,使命的执行时刻较量长(好比,上面demo配置了10秒),会导致行列的使命越积越多,导致呆板内存行使不断飙升, 最终导致OOM。
行使场景
FixedThreadPool 合用于处理赏罚CPU麋集型的使命,确保CPU在恒久被事变线程行使的环境下,尽也许的少的分派线程,即合用执行恒久的使命。
newCachedThreadPool
- public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
- return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
- 60L, TimeUnit.SECONDS,
- new SynchronousQueue<Runnable>(),
- threadFactory);
- }
- 复制代码
线程池特点:
- 焦点线程数为0
- 最大线程数为Integer.MAX_VALUE
- 阻塞行列是SynchronousQueue
- 非焦点线程空闲存活时刻为60秒
当提交使命的速率大于处理赏罚使命的速率时,每次提交一个使命,就肯定会建设一个线程。极度环境下会建设过多的线程,耗尽 CPU 和内存资源。因为空闲 60 秒的线程会被终止,长时刻保持空闲的 CachedThreadPool 不会占用任何资源。
事变机制
- 提交使命
- 由于没有焦点线程,以是使命直接加到SynchronousQueue行列。
- 判定是否有空闲线程,假若有,就去取出使命执行。
- 假如没有空闲线程,就新建一个线程执行。
- 执行完使命的线程,还可以存活60秒,假如在这时代,接到使命,可以继承活下去;不然,被烧毁。
实例代码
- ExecutorService executor = Executors.newCachedThreadPool();
- for (int i = 0; i < 5; i++) {
- executor.execute(() -> {
- System.out.println(Thread.currentThread().getName()+"正在执行");
- });
- }
- 复制代码
运行功效:
行使场景
用于并发执行大量短期的小使命。
newSingleThreadExecutor
- public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
- return new FinalizableDelegatedExecutorService
- (new ThreadPoolExecutor(1, 1,
- 0L, TimeUnit.MILLISECONDS,
- new LinkedBlockingQueue<Runnable>(),
- threadFactory));
- }
- 制代码
线程池特点
- 焦点线程数为1
- 最大线程数也为1
- 阻塞行列是LinkedBlockingQueue
- keepAliveTime为0
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|