gpt4 book ai didi

Java 事件生成

转载 作者:行者123 更新时间:2023-11-30 03:42:03 25 4
gpt4 key购买 nike

我想设计一个系统,它将以恒定的速率生成特定事件,并且这将在后台继续进行。如果我愿意的话,它会在前台提供一些其他事件的输出。但后台事件不会停止。在java中实现它的最佳方法是什么?

最佳答案

这是线程的定义,需要有一定程度的理解。

在最简单的层面上,创建一个 hibernate 一段时间然后执行代码的线程。还有很多其他方法可以做到这一点,但很少有比重写线程的 run 方法更短的方法。

如果您想要更抽象的东西,请查看 Java 文档中的并发包,有很多方法可以完全满足您的要求,java.util.timer 也是一个不错的选择。

请注意不同线程可能同时访问的变量和集合。另请注意,如果您有一个 GUI,则不应从此新线程更新您的 GUI。

编辑以添加非线程解决方案

(我认为这并不是您真正想要的,但在评论中您要求非线程解决方案)。

如果您希望在没有线程的情况下执行此操作(意味着您确实希望在当前线程中执行此操作),您必须偶尔“中断”当前线程以检查是否需要处理其他任务。首先你需要一个像这样的方法:

long lastRun=System.currentTimeInMillis();
final long howOftenToRun=60*1000 // every minute

testForBackgroundTask() {
if(lastRun + howOftenToRun < System.currentTimeInMillis()) {
// This will drift, if you don't want drift use lastRun+=howOftenToRun
lastRun=System.currentTimeInMillis()
// this is where your occasional task is.
// The task could be in-line here but of course that would violate the SRP
runBackgroundTask()
}
}

之后,您需要在整个代码中添加 testForBackgroundTask:

lotsOfStuff....
testForBackgroundTask()
longMethod()
testForBackgroundTask()
morestuff...
testForBackgroundTask()
...

请注意,如果 longMethod() 需要很长时间,那么您还需要在其中调用 testForBackgroundTask() 。

我知道这很丑陋,而这个解决方案的丑陋之处就是使用线程的原因。唯一的好处就是绝对可以防止线程冲突。

另一种单线程解决方案(使代码事件驱动)更加困难,并且会严重影响您的代码(有一种称为有限状态引擎的构造就是为此目的而设计的)。

关于Java 事件生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26617186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com