Java 处于休眠状态的线程如何接收事件?

Java 处于休眠状态的线程如何接收事件?,java,multithreading,listener,runnable,Java,Multithreading,Listener,Runnable,我的代码: 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

我的代码:

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
    }


    @Override
    public void run() {
        //Do nothing, let the listener do its job
        while (isRunning) {
            try {
                logger.info("Sleeping...");
                Thread.sleep(5000);
                logger.info("Done sleeping...");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    } 
}
}
基本上,
run()
方法什么也不做——只是每5秒睡眠一次,然后醒来,再睡一次。我不明白的是,当它处于休眠状态时,这个
EventHandler
类仍然会获取事件。这是怎么发生的?既然线程处于休眠状态,类不应该停止接收事件吗?

线程和类是两个不同的东西。EventHandler是一个具有执行其run方法的专用线程的对象。同时,它还有一个onEvent方法,可以被其他线程调用

在OneEvent方法和run方法中记录线程ID,以确认休眠线程不参与接收事件

类不拥有线程。当程序中的其他线程调用OneEvent时,您的线程正在进行休眠、日志记录和标志检查。(另外,OS级线程与对象是分开的,您将其引用保存为线程。)


您可以使用线程池,这将使您的应用程序保持活动状态,直到您关闭它。将Runnable提交到线程池比为每个Runnable提供自己的专用线程要好。

该线程似乎真的没用。我不知道您认为侦听器是如何工作的,但基本上它们只是引用,您可能从未见过的某个线程在看到某些事情发生时将使用它们调用某些方法

监听器不只是“捕捉”任何扔到房间里的事件


就像我说的:这个线程看起来没用,因为它什么都不做。完全这些事件是从不同的线程调用的。您不需要这个线程。

那么您是说EventHandler类有两个线程?一个专用于EventHandler本身,另一个只用于run方法?@Miguel:它被其他线程调用。与从另一个线程调用stop的方式相同。@MiguelPortugal,类没有线程。类是一种结构,它定义了数据的布局,并定义了对数据进行操作的方法。“线程”是Java中执行方法的东西的名称。程序中的某些线程执行EventHandler的
start()
方法:这将生成一个新线程来执行run()方法。同时,其他一些线程(可能与调用start()的线程相同,也可能不是。如果没有看到更多的代码,就无法判断)可以自由调用onEvent()。我知道该线程似乎没有用。我把它放在那里只是为了防止我的独立Java应用程序在main()完成后退出。除了这个糟糕的运行实现之外,我还能阻止我的应用程序退出吗?你不是在什么地方注册了你的侦听器吗?你到底想抓住什么样的事件?由于您似乎不使用图形用户界面(这将使应用程序通过自己的线程保持活力),我真的开始怀疑了。操作系统事件?如果是这样,我将没有足够的知识来帮助您^^我正在处理从PBX系统推送的事件。基本上是电话事件。有人打电话,有人说话,等等。。。所有这些事件都由我的应用程序处理。是的,我没有GUI,它也不是web应用程序。这只是一个简单的独立Java应用程序:)Sry如果我看起来有点困惑的话,那就是这有点像Swing将其主线程放在某个动作侦听器类中作为按钮。好吧,是的,你必须让那东西活着。我同意^^^仍然。。。至少我认为我应该将EventHandler从线程中分离出来。它似乎放错地方了。@MiguelPortugal如果问题是main()完成了,那么为什么让main()完成呢?或者,如果程序在main()完成时退出,这是因为主线程是唯一的非守护进程线程。如果目的是让程序在main()完成后继续运行,那么为什么它的所有其他线程都是守护进程?