【发布时间】:2018-05-05 11:14:57
【问题描述】:
我有一个 ssh 客户端库实现。每个连接都有几个执行者。一种是使用 ScheduledThreadPoolExecutor 的线程池,用于对短期任务和计时器进行排队。一个是读执行器,用于持有一个数据包接收任务。一种是写执行器,串行执行任务,每个任务向服务器发送一个数据包。当然 read 和 write executor 都是单线程的,write executor 就像消息队列一样使用。
我遇到的问题是:排队消息的方法和排队任务的一些方法返回一个 CompletableFuture。我使用 CompletableFuture.runAsync 方法排队。但是,连接可能会以有序或强制的方式异步关闭。在这种情况下,使用 shutdownNow 方法关闭部分或所有池。
如果某些线程(包括这些池之外的线程)可以等待某些任务同步完成,并且由于包括网络错误在内的所有原因而存在异步关闭的风险,该怎么办? shutdownNow 不会发出未来的取消方法。我不关心实际任务是否被中断,我只关心如果执行程序在他们的任务仍在队列中时关闭,futures 会无限期地阻塞。
处理这种情况的最佳做法是什么?人们做什么/等等?
【问题讨论】:
标签: java multithreading asynchronous executor