我的代码:
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
只能有一个实例。它工作得很好,但我有一些顾虑:
run()
方法,除了在无限循环中运行之外什么都不做。这个可以吗? 对于非网络应用程序上的听众,我真的没有任何经验。我想知道你们是否可以提供一些意见。
答案 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);
你不需要在这种方法中启动另一个线程。