加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

3年工作经验,工作中还不会使用多线程?阿里P6:别慌,我都总结好了

发布时间:2019-07-19 00:19:44 所属栏目:移动互联 来源:Jay_huaxiao
导读:把握线程池是后端措施员的根基要求,信托各人求职口试进程中,险些城市被问到有关于线程池的题目。我在网上汇集了几道经典的线程池口试题,并以此为切入点,谈谈我对线程池的领略。假若有那边领略不正确,很是但愿各人指出,接下来各人一路说明进修吧。 经

事变机制:

3年岁情履历,事变中还不会行使多线程?阿里P6:别慌,我都总结好了
  • 提交使命
  • 假如线程数少于焦点线程,建设焦点线程执利用命
  • 假如线程数便是焦点线程,把使命添加到LinkedBlockingQueue阻塞行列
  • 假如线程执行完使命,去阻塞行列取使命,继承执行。

实例代码

  1. ExecutorService executor = Executors.newFixedThreadPool(10); 
  2.  for (int i = 0; i < Integer.MAX_VALUE; i++) { 
  3.  executor.execute(()->{ 
  4.  try { 
  5.  Thread.sleep(10000); 
  6.  } catch (InterruptedException e) { 
  7.  //do nothing 
  8.  } 
  9.  }); 
  10. 复制代码 

IDE指定JVM参数:-Xmx8m -Xms8m :

3年岁情履历,事变中还不会行使多线程?阿里P6:别慌,我都总结好了

run以上代码,会抛出OOM:

3年岁情履历,事变中还不会行使多线程?阿里P6:别慌,我都总结好了

因此,口试题:行使无界行列的线程池会导致内存飙升吗?

谜底 :会的,newFixedThreadPool行使了无界的阻塞行列LinkedBlockingQueue,假如线程获取一个使命后,使命的执行时刻较量长(好比,上面demo配置了10秒),会导致行列的使命越积越多,导致呆板内存行使不断飙升, 最终导致OOM。

行使场景

FixedThreadPool 合用于处理赏罚CPU麋集型的使命,确保CPU在恒久被事变线程行使的环境下,尽也许的少的分派线程,即合用执行恒久的使命。

newCachedThreadPool

  1. public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { 
  2.  return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 
  3.  60L, TimeUnit.SECONDS, 
  4.  new SynchronousQueue<Runnable>(), 
  5.  threadFactory); 
  6.  } 
  7. 复制代码 

线程池特点:

  • 焦点线程数为0
  • 最大线程数为Integer.MAX_VALUE
  • 阻塞行列是SynchronousQueue
  • 非焦点线程空闲存活时刻为60秒

当提交使命的速率大于处理赏罚使命的速率时,每次提交一个使命,就肯定会建设一个线程。极度环境下会建设过多的线程,耗尽 CPU 和内存资源。因为空闲 60 秒的线程会被终止,长时刻保持空闲的 CachedThreadPool 不会占用任何资源。

事变机制

3年岁情履历,事变中还不会行使多线程?阿里P6:别慌,我都总结好了
  • 提交使命
  • 由于没有焦点线程,以是使命直接加到SynchronousQueue行列。
  • 判定是否有空闲线程,假若有,就去取出使命执行。
  • 假如没有空闲线程,就新建一个线程执行。
  • 执行完使命的线程,还可以存活60秒,假如在这时代,接到使命,可以继承活下去;不然,被烧毁。

实例代码

  1.  ExecutorService executor = Executors.newCachedThreadPool(); 
  2.  for (int i = 0; i < 5; i++) { 
  3.  executor.execute(() -> { 
  4.  System.out.println(Thread.currentThread().getName()+"正在执行"); 
  5.  }); 
  6.  } 
  7. 复制代码 

运行功效:

3年岁情履历,事变中还不会行使多线程?阿里P6:别慌,我都总结好了

行使场景

用于并发执行大量短期的小使命。

newSingleThreadExecutor

  1. public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) { 
  2. return new FinalizableDelegatedExecutorService 
  3. (new ThreadPoolExecutor(1, 1, 
  4. 0L, TimeUnit.MILLISECONDS, 
  5. new LinkedBlockingQueue<Runnable>(), 
  6. threadFactory)); 
  7. 制代码 

线程池特点

  • 焦点线程数为1
  • 最大线程数也为1
  • 阻塞行列是LinkedBlockingQueue
  • keepAliveTime为0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读