Java 事件生成

标签 java

我想设计一个系统,它将以恒定的速率生成特定事件,并且这将在后台继续进行。如果我愿意的话,它会在前台提供一些其他事件的输出。 但后台事件不会停止。在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/

相关文章:

java - Eclipse 内容辅助中间字母匹配

java - Spring boot 中 jQuery AJAX 请求出现 404

java - 如何使 activemq 真正可靠?当broker断开连接时消息丢失

java - H2 数据库 : how to protect with encryption, 不暴露文件加密 key

java - ChromeDriver 无法访问选择

java - 方法返回类型

java - Enum.valueOf 的一般使用

java - 如何将数据保存在多个 sql 行的一个 thymeleaf 页面中

java - 使用多个类的 Bukkit

java - 使用 ANTLR v3 编译 Java 源代码时出现问题