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

时间:2016-03-03 19:11:18

标签: java singleton listener

我的代码:

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%......为什么会这样?
  3. 对于非网络应用程序上的听众,我真的没有任何经验。我想知道你们是否可以提供一些意见。

3 个答案:

答案 0 :(得分:0)

  

我觉得奇怪的是我有一个run()方法,除了在无限循环中运行之外什么都不做。这没关系吗?

没有。这大致正好相反。

  

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

你不需要在这种方法中启动另一个线程。