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

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

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

通过以上说明,submit执行的使命,可以通过Future工具的get要领吸取抛出的非常,再举办处理赏罚。 我们再通过一个demo,看一下Future工具的get要领处理赏罚非常的姿势,如下图:

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

其他两种处理赏罚线程池非常方案

除了以上1.在使命代码try/catch捕捉非常,2.通过Future工具的get要领吸取抛出的非常,再处理赏罚两种方案外,尚有以上两种方案:

3.为事变者线程配置UncaughtExceptionHandler,在uncaughtException要领中处理赏罚非常

我们直接看这样实现的正确姿势:

  1. ExecutorService threadPool = Executors.newFixedThreadPool(1, r -> { 
  2.  Thread t = new Thread(r); 
  3.  t.setUncaughtExceptionHandler( 
  4.  (t1, e) -> { 
  5.  System.out.println(t1.getName() + "线程抛出的非常"+e); 
  6.  }); 
  7.  return t; 
  8.  }); 
  9.  threadPool.execute(()->{ 
  10.  Object object = null; 
  11.  System.out.print("result## " + object.toString()); 
  12.  }); 
  13. 复制代码 

运行功效:

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

4.重写ThreadPoolExecutor的afterExecute要领,处理赏罚转达的非常引用

这是jdk文档的一个demo:

  1. class ExtendedExecutor extends ThreadPoolExecutor { 
  2.  // 这然则jdk文档内里给的例子。。 
  3.  protected void afterExecute(Runnable r, Throwable t) { 
  4.  super.afterExecute(r, t); 
  5.  if (t == null && r instanceof Future<?>) { 
  6.  try { 
  7.  Object result = ((Future<?>) r).get(); 
  8.  } catch (CancellationException ce) { 
  9.  t = ce; 
  10.  } catch (ExecutionException ee) { 
  11.  t = ee.getCause(); 
  12.  } catch (InterruptedException ie) { 
  13.  Thread.currentThread().interrupt(); // ignore/reset 
  14.  } 
  15.  } 
  16.  if (t != null) 
  17.  System.out.println(t); 
  18.  } 
  19. }} 
  20. 复制代码 

因此,被问到线程池非常处理赏罚,怎样答复?

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

。线程池的事变行列

线程池都有哪几种事变行列?

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • DelayQueue
  • PriorityBlockingQueue
  • SynchronousQueue

ArrayBlockingQueue

ArrayBlockingQueue(有界行列)是一个用数组实现的有界阻塞行列,按FIFO排序量。

LinkedBlockingQueue

LinkedBlockingQueue(可配置容量行列)基于链表布局的阻塞行列,按FIFO排序使命,容量可以选择举办配置,不配置的话,将是一个无界线的阻塞行列,最大长度为Integer.MAX_VALUE,吞吐量凡是要高于ArrayBlockingQuene;newFixedThreadPool线程池行使了这个行列

DelayQueue

DelayQueue(耽误行列)是一个使命按时周期的耽误执行的行列。按照指定的执行时刻从小到大排序,不然按照插入到行列的先后排序。newScheduledThreadPool线程池行使了这个行列。

PriorityBlockingQueue

PriorityBlockingQueue(优先级行列)是具有优先级的无界阻塞行列;

SynchronousQueue

SynchronousQueue(同部行列)一个不存储元素的阻塞行列,每个插入操纵必需比及另一个线程挪用移除操纵,不然插入操纵一向处于阻塞状态,吞吐量凡是要高于LinkedBlockingQuene,newCachedThreadPool线程池行使了这个行列。

针劈口试题:线程池都有哪几种事变行列? 我认为,答复以上几种ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue等,说出它们的特点,并团结行使到对应行列的常用线程池(如newFixedThreadPool线程池行使LinkedBlockingQueue),举办睁开叙述, 就可以啦。

几种常用的线程池

  • newFixedThreadPool (牢靠命目线程的线程池)
  • newCachedThreadPool(可缓存线程的线程池)
  • newSingleThreadExecutor(单线程的线程池)
  • newScheduledThreadPool(按时及周期执行的线程池)

newFixedThreadPool

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

线程池特点:

  • 焦点线程数和最大线程数巨细一样
  • 没有所谓的非空闲时刻,即keepAliveTime为0
  • 阻塞行列为无界行列LinkedBlockingQueue

(编辑:湖南网)

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

热点阅读