繁体   English   中英

如何在独立的Java应用程序中有效地实现单例侦听器?

[英]How do I efficiently implement a singleton listener in a standalone Java application?

我的代码:

public class Server {
    public static void main(String[] args) {
        EventHandler.getInstance().start();
    }
    ...
}

public class EventHandler implements Runnable, SomeEventListener {
    private static final EventHandler INSTANCE = new EventHandler();
    private static final Thread THREAD = new Thread(INSTANCE);
    private static volatile boolean isRunning = false;

    private EventHandler () {}

    private static EventHandler getInstance() {
        return INSTANCE;
    }

    public void start() {
        isRunning = true;
        THREAD.start();
    }

    public void stop() {
        isRunning = false;
    }

    //Listener method that was overriden
    public void onEvent(Event event) {
        //...do stuff
    }

    public void run() {
        while (isRunning) {
            //Does nothing... just keeps the application running. Is this okay?
        }
    }
}

只能有一个EventHandler实例。 它工作得很好,但我有一些担忧:

  1. 我发现有一个run()方法除了在无限循环中运行之外什么都没做,我觉得很奇怪。 这个可以吗?
  2. 在Windows中,当我启动此应用程序时。 我的CPU使用率为25%,但是在Linux上启动时,CPU使用率达到100%......为什么会这样?

对于非Web应用程序上的侦听器,我真的没有任何经验。 我想知道你们是否可以提供一些意见。

我发现有一个run()方法除了在无限循环中运行之外什么都没做,我觉得很奇怪。 这个可以吗?

不,这大致相反。

在Windows中,当我启动此应用程序时。 我的CPU使用率为25%,但是在Linux上启动时,CPU使用率达到100%......为什么会这样?

它们具有相同数量的核心吗? 你正在用循环捆绑一个。

我不明白为什么你需要给它自己的线程(因此你需要实现Runnable和覆盖run())。

现在我承认我不知道SomeEventListener是做什么的,但是因为你没有从run()方法调用onEvent方法,并且那个方法就是你的新线程所做的,所以没有理由创建一个新的线程根本就是onEvent方法(希望)无论如何都会从另一个线程调用。

我不知道你是如何注册你的监听器及其功能的,但也许你只能创建EventHandler实例,然后只使用它的方法作为某种回调:

Consumer<Event> con = EventHandler.getInstance()::onEvent;
// When event arrives
con.apply(event);

您不需要在此方法中启动另一个线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM