
【线程/线程池/Future】
文章平均质量分 76
线程/线程池
zero__007
这个作者很懒,什么都没留下…
展开
-
CompletionService
CompletionService将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者take已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。通常,原创 2015-03-25 18:47:08 · 404 阅读 · 0 评论 -
FutureTask
public class FutureTask<V> implements RunnableFuture<V>原创 2015-03-24 20:06:46 · 417 阅读 · 0 评论 -
Future
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future示例:packag原创 2015-03-25 18:45:37 · 386 阅读 · 0 评论 -
CompletableFuture(二)
转载自:http://www.jb51.net/article/51163.htm创造和获取CompletableFuturestatic CompletableFuture supplyAsync(Supplier supplier);static CompletableFuture supplyAsync(Supplier supplier, Executor exe转载 2016-01-24 13:55:57 · 5795 阅读 · 0 评论 -
CompletableFuture(三)
可以对CompletableFuture指定处理完成的时间,如果按时完成则通知,否则抛出超时异常并处理。 public static void main(String[] args) { CompletableFuture responseFuture = CompletableFuture.supplyAsync(() -> { try {原创 2016-02-24 21:38:31 · 882 阅读 · 0 评论 -
CompletableFuture(一)
CompletableFuture是java8中添加的一个类了,这个类主要的作用就是提供了新的方式来完成异步处理,包括合成和组合事件的非阻塞方式。简单示例:对于Future可以这样提交任务:ExecutorService executor = Executors.newFixedThreadPool(5);Future result = executor.submit(() -原创 2016-01-23 22:21:18 · 3223 阅读 · 0 评论 -
Future.get() 在配置RejectedExecutionHandler为ThreadPoolExecutor.DiscardPolicy策略时一直阻塞
1、重写DiscardPolicy,取消任务: ((FutureTask) r).cancel(true)。2、不使用DiscardPolicy,建议还是用线程池默认的AbortPolicy,可以重写,打印日志,再调用super.rejectedExecution(r, executor),抛出默认异常行为。3、使用java.util.concurrent.FutureTask#get(long, java.util.concurrent.TimeUnit) 带有超时的方法获取结果。转载 2022-10-14 16:46:50 · 514 阅读 · 0 评论 -
又一起线上事故,线程池千万别乱用
在高并发、异步化等场景,线程池的运用可以说无处不在。线程池从本质上来讲,即通过空间换取时间,因为线程的创建和销毁都是要消耗资源和时间的,对于大量使用线程的场景,使用池化管理可以延迟线程的销毁,大大提高单个线程的复用能力,进一步提升整体性能。今天遇到了一个比较典型的线上问题,刚好和线程池有关,另外涉及到死锁、jstack命令的使用、JDK不同线程池的适合场景等知识点,同时整个调查思路可以借鉴,特此记录和分享一下。01 业务背景描述该线上问题发生在广告系统的核心扣费服务,首先简单交代下大致的业务流程,方便转载 2021-02-26 16:31:19 · 579 阅读 · 0 评论 -
再聊线程池
关于线程池的介绍在http://blog.csdn.net/zero__007/article/details/43795287、http://blog.csdn.net/zero__007/article/details/44102239 已经介绍了,这里只是稍微补充补充。RejectedExecutionHandler ThreadPoolExecutor的构造函数中会有该参数,表示拒绝策原创 2017-11-15 19:58:26 · 251 阅读 · 0 评论 -
Java线程池
public interface ExecutorService extends Executor为Executor提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future的方法。可以关闭ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭ExecutorService。shutdown()方法在终止前允许执行以前提交的任务,而shutdownNow()方法原创 2015-03-27 13:34:48 · 600 阅读 · 0 评论 -
线程池的异常处理机制
转载自:https://github.com/aCoder2013/blog/issues/3 先上两段代码: ExecutorService threadPool = Executors.newFixedThreadPool(1); threadPool.execute(() -> { System.out.println("execute"转载 2017-12-27 18:44:12 · 1585 阅读 · 0 评论 -
Tomcat的StandardThreadExecutor
JDK中的ThreadExecutor中的execute方法的处理逻辑应该都知道: 1.小于等于Coresize:创建线程执行; 2.大于CoreSize:加入队列; 3.队列满且小于maxSize:有空闲线程使用空闲线程执行,没有的话,创建线程执行;如果大于maxSize则拒绝策略执行。 这样会造成一个现象,如果设置的不恰当,队列使用LinkedBlockingQue原创 2018-01-24 16:16:59 · 1359 阅读 · 2 评论 -
线程池使用拒绝策略时需要注意的坑
线程池使用FutureTask的时候如果拒绝策略设置为了DiscardPolicy和DiscardOldestPolicy并且在被拒绝的任务的Future对象上调用无参get方法那么调用线程会一直被阻塞。转载 2017-12-27 18:54:44 · 11186 阅读 · 3 评论 -
线程池的诡异异常
转载自:https://crossoverjie.top/2019/03/12/troubleshoot/thread-gone/ 现象:线程池使用时,任务中抛出一个没有捕获的异常时,线程池没有挂掉,并且任务也没有继续运行。 代码模拟:ExecutorService executor = Executors.newSingleThreadExecutor();executo...转载 2019-06-24 19:18:33 · 965 阅读 · 0 评论 -
Thread.State
转载自:http://blog.csdn.net/codetomylaw/article/details/40263261 http://blog.csdn.net/fenglibing/article/details/6411940 一般查看Java程序堆栈信息时,会使用jstack工具来获得java stack和native stack的信息,如果现在运行...转载 2016-08-09 22:28:41 · 517 阅读 · 0 评论 -
查找Java程序中CPU使用率最大的线程
1、获得进程pid ps -ef | grep java2、列出该进程的所有线程 ps p ${pid} -L -o pcpu,pmem,pid,tid // tid即线程 或者 top -H -p ${pid}3、找出哪个线程tid占用最多,然后将这个tid转换为16进制 printf "%x\n" ${tid}4、打印线程的堆栈信息...原创 2016-08-24 21:26:22 · 1545 阅读 · 0 评论 -
Fork/Join 框架
1 什么是 Fork/Join 框架 Fork/Join 框架是 Java7 供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join 框架中, Fork 就是把一个大任务切分为若干子任务并行的执行, Join 就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算 1+2+。。。+ 10000,可以分原创 2015-02-13 15:54:15 · 505 阅读 · 0 评论 -
Thread.interrupt与LockSupport
转载自:http://agapple.iteye.com/blog/970055 http://www.tuicool.com/articles/MveUNzF首先抛几个问题: Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException...转载 2016-06-02 21:33:43 · 1081 阅读 · 0 评论 -
线程泄漏
转载自:http://blog.csdn.net/huoyunshen88/article/details/8618642 当单线程应用程序中的主线程抛出一个未捕获的异常时,因为控制台中会打印堆栈跟踪(也因为程序停止),所以很可能注意到。但在多线程应用程序中,尤其是在作为服务器运行并且不与控制台相连的应用程序中,线程死亡可能成为不太引人注目的事件,这会导致局部系统失败,从而产生转载 2016-03-29 17:17:22 · 2680 阅读 · 0 评论 -
ScheduledExecutorService
public interface ScheduledExecutorService extends ExecutorService一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。schedule 方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。scheduleAtFixedRate 和 scheduleWithFixedDelay 方法创建并执行某原创 2015-03-27 13:38:06 · 330 阅读 · 0 评论 -
LockSupport
转载自: http://blog.csdn.net/hengyunabc/article/details/28126139 http://www.jb51.net/article/88395.htm LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程。转载 2017-11-06 19:33:30 · 257 阅读 · 0 评论