加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

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

发布时间:2019-07-20 17:49:06 所属栏目:评测 来源: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:别慌,我都总结好了

(编辑:晋中站长网)

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

热点阅读