java - 在Java中创建另一个任务时取消当前任务并重用同一线程

标签 java multithreading performance threadpoolexecutor java-threads

请花一些时间阅读以下内容。非常感谢您的帮助

我有一个需要监视一些实时 Activity 的场景。假设某个方法在毫秒内被实时调用。我必须监视好像第一次调用该方法以及何时最后调用该方法。

因此,在该方法被最后击中之后,我需要等待一段时间,例如10秒钟,然后查看在该时间内是否没有再次调用它。如果未调用,则需要运行一些代码。

我想使用 ExecuterService 并使用 newCachedThreadPool()。但是我对如何实现这一点感到困惑。

如果您不确定我在说什么,请举个例子,当网络出现故障时,并且u在接收到心跳信号后突然停止接收信号,然后在屏幕上显示一些错误消息,例如连接不可用。在我的情况下,它的某个第三方应用程序正在发送消息,并且它只是一种通信方式。例如,我的应用程序发送了一些请求,而其他应用程序则继续发送响应。因此,我需要监视该响应,并且某种程度上需要知道何时收到上一个响应。

我的方法-我想到了每次调用该方法都会执行一个任务,该方法将等待10秒,并且在10秒之内,如果再次调用该方法,它将以某种方式取消当前任务并创建另一个任务(或重用)如果可能的话)将再次运行10秒钟。这将一直持续到收到最后一条消息为止(该方法最后一次调用时),并且在此之后10秒钟的延迟结束后,将执行任务,并且一些代码将运行以在UI上显示错误消息。

我以前使用过Timer,它解决了这个问题,但是作为新Timer出现了性能问题,每次接收到新消息时都会实例化一个新TimerTask,从而创建了很多垃圾回收器无法快速回收的对象,从而导致outOfMemorry错误,使服务器无响应。显然,这是一个错误的代码,这就是为什么我在这里寻求帮助。

请帮助我提供一些解决此问题的方法。

最佳答案

如果您使用最基本的工具进行处理,这将非常容易-有时遇到简单问题时,诸如线程池之类的增强工具只会分散琐碎的解决方案。

假设您有一个简单的线程(Runnable)。该线程检查时间戳以查看该时间戳是否为10秒。如果是,则通知您的听众,否则,请延迟几毫秒,然后再次检查。

现在,您的方法要做的就是每次运行时将(易失)时间戳更新为“现在”。这里可能还有其他一些业务规则要实现,但这应该是一个很好的基础。

现在唯一的问题是如何通知听众。如果这种情况很少发生,您可能可以在检查时间的同一线程上调用它们-但我认为您可以排除这种情况。如果它发生的频率更高,但又不想/不需要它“嵌套”通知,则可以在没有其他目的的情况下挂起第二个线程,只是在由观察者线程触发时通知客户端。

如果您需要“嵌套”通知(在原始通知返回之前通知监听器),则需要一个线程池以使通知继续进行。

最后,我想如果您想在每10秒钟不调用计时器,但又不想嵌套,则计时线程可以将“事件”推送到线程安全队列中,而“通知”线程可以将其退出并一次发送一个事件。

那应该涵盖所有可能性。

关于java - 在Java中创建另一个任务时取消当前任务并重用同一线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019888/

相关文章:

java - 如何使用 jaxb 从 java 对象创建 xml

java - 从文本文件中读取二维数组

java - 在 Android 中使用来自 Google Places API 的 JSON 响应

.net 多线程

java - 增加某个app的java堆空间

java - 我将如何使用 while 循环来获取多个输入?

c++ - 在 C++ 中线程化以保持两个函数并行运行

C : printf() not thread safe with flockfile()

python - Python 中的二维与一维字典效率

c# - 遍历后加速数组查找?