2016-03-03 79 views
0

我的代码:如何在独立的Java应用程序中高效地实现单例侦听器?

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应用程序监听器的经验。我想知道你们是否可以提供一些意见。

+0

你是什么意思工作正常?什么也不做? –

+0

@SleimanJneidi我的意思是,我的应用程序按照我想要的方式工作。这只是CPU使用率困扰我,也许我猜这是由无限循环造成的...... – mpmp

+0

那么循环体是空的吗? –

回答

0

我觉得奇怪的是我有一个run()方法,它什么都不做,只能在无限循环中运行。这个可以吗?

不,这与大致相反。

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

它们是否具有相同数量的内核?你正在用你的循环绑定一个。

0

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

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

+0

如果我没有实现Runnable并无限运行,当main方法结束时,应用程序退出。 – mpmp

+0

但是,这一切都如何计划这种方式吗?因为我看到它的方式,如果这是保持应用程序活着的唯一线程,它确实不应该做一件事。如果这是你唯一的线程,那么你确实需要在run方法中实际处理Events(捕获它们并调用onEvent方法),因为它不会在其他地方被调用。 – Mark

0

我不知道你究竟是如何注册监听器和它做什么,但也许你只能创建EventHandler实例,然后只使用它的方法是某种回调:

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

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

+0

我不需要启动另一个线程?如果我不这样做,那么应用程序在主方法完成后立即退出。我的应用程序只是一个独立的Java应用程序。 哦,顺便说一句,我使用Java 7 – mpmp

相关问题