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

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

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

实例代码

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

运行功效:

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

行使场景

合用于串行执利用命的场景,一个使命一个使命地执行。

newScheduledThreadPool

  1.  public ScheduledThreadPoolExecutor(int corePoolSize) { 
  2.  super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, 
  3.  new DelayedWorkQueue()); 
  4.  } 
  5. 复制代码 

线程池特点

  • 最大线程数为Integer.MAX_VALUE
  • 阻塞行列是DelayedWorkQueue
  • keepAliveTime为0
  • scheduleAtFixedRate() :按某种速度周期执行
  • scheduleWithFixedDelay():在某个耽误后执行

事变机制

  • 添加一个使命
  • 线程池中的线程从 DelayQueue 中取使命
  • 线程从 DelayQueue 中获取 time 大于便是当前时刻的task
  • 执行完后修改这个 task 的 time 为下次被执行的时刻
  • 这个 task 放回DelayQueue行列中

实例代码

  1.  /** 
  2.  建设一个给定初始耽误的隔断性的使命,之后的下次执行时刻是上一次使命从执行到竣事所必要的时刻+* 给定的隔断时刻 
  3.  */ 
  4.  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 
  5.  scheduledExecutorService.scheduleWithFixedDelay(()->{ 
  6.  System.out.println("current Time" + System.currentTimeMillis()); 
  7.  System.out.println(Thread.currentThread().getName()+"正在执行"); 
  8.  }, 1, 3, TimeUnit.SECONDS); 
  9. 复制代码 

运行功效:

3年岁情履历,事变中还不会行使多线程?阿里P6:别慌,我都总结好了
  1. /** 
  2.  建设一个给定初始耽误的隔断性的使命,之后的每次使命执行时刻为 初始耽误 + N * delay(隔断)  
  3.  */ 
  4.  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 
  5.  scheduledExecutorService.scheduleAtFixedRate(()->{ 
  6.  System.out.println("current Time" + System.currentTimeMillis()); 
  7.  System.out.println(Thread.currentThread().getName()+"正在执行"); 
  8.  }, 1, 3, TimeUnit.SECONDS);; 
  9. 复制代码 

行使场景

周期性执利用命的场景,必要限定线程数目的场景

回到口试题:说说几种常见的线程池及行使场景?

答复这四种经典线程池 :newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool,newScheduledThreadPool,分线程池特点,事变机制,行使场景分隔描写,再说明也许存在的题目,好比newFixedThreadPool内存飙升题目 即可

线程池状态

线程池有这几个状态:RUNNING,SHUTDOWN,STOP,TIDYING,TERMINATED。

  1. //线程池状态 
  2.  private static final int RUNNING = -1 << COUNT_BITS; 
  3.  private static final int SHUTDOWN = 0 << COUNT_BITS; 
  4.  private static final int STOP = 1 << COUNT_BITS; 
  5.  private static final int TIDYING = 2 << COUNT_BITS; 
  6.  private static final int TERMINATED = 3 << COUNT_BITS; 
  7. 复制代码 

线程池各个状态切换图:

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

(编辑:湖南网)

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

热点阅读