3年工作经验,工作中还不会使用多线程?阿里P6:别慌,我都总结好了
通过以上分析,submit执行的任务,可以通过Future对象的get方法接收抛出的异常,再进行处理。 我们再通过一个demo,看一下Future对象的get方法处理异常的姿势,如下图: ![]() 其他两种处理线程池异常方案 除了以上1.在任务代码try/catch捕获异常,2.通过Future对象的get方法接收抛出的异常,再处理两种方案外,还有以上两种方案: 3.为工作者线程设置UncaughtExceptionHandler,在uncaughtException方法中处理异常 我们直接看这样实现的正确姿势:
运行结果: ![]() 4.重写ThreadPoolExecutor的afterExecute方法,处理传递的异常引用 这是jdk文档的一个demo:
因此,被问到线程池异常处理,如何回答? ![]() 。线程池的工作队列 线程池都有哪几种工作队列?
ArrayBlockingQueueArrayBlockingQueue(有界队列)是一个用数组实现的有界阻塞队列,按FIFO排序量。 LinkedBlockingQueueLinkedBlockingQueue(可设置容量队列)基于链表结构的阻塞队列,按FIFO排序任务,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_VALUE,吞吐量通常要高于ArrayBlockingQuene;newFixedThreadPool线程池使用了这个队列 DelayQueueDelayQueue(延迟队列)是一个任务定时周期的延迟执行的队列。根据指定的执行时间从小到大排序,否则根据插入到队列的先后排序。newScheduledThreadPool线程池使用了这个队列。 PriorityBlockingQueuePriorityBlockingQueue(优先级队列)是具有优先级的无界阻塞队列; SynchronousQueueSynchronousQueue(同步队列)一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene,newCachedThreadPool线程池使用了这个队列。 针对面试题:线程池都有哪几种工作队列? 我觉得,回答以上几种ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue等,说出它们的特点,并结合使用到对应队列的常用线程池(如newFixedThreadPool线程池使用LinkedBlockingQueue),进行展开阐述, 就可以啦。 几种常用的线程池
newFixedThreadPool
线程池特点:
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |