睡眠中的线程如何接收事件?

How can a Thread that is asleep receive events?

我的代码:

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 class 仍然会收到事件。这是怎么发生的?由于线程处于休眠状态,class 不应该停止接收事件吗?

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

在 onEvent 方法和 运行 方法中记录线程 ID,以确认休眠线程不参与接收事件。

类 不拥有话题。您的 THREAD 正在自旋进行休眠、日志记录和标志检查,而您程序中的其他线程调用 onEvent。 (此外,OS 级线程与您将其引用保存为 THREAD 的对象分开。)

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

那个帖子好像真的没用。我不知道您认为 Listeners 是如何工作的,但基本上它们只是引用,您可能从未见过的一些线程在看到某些事情发生时会用来调用某些方法。

监听器不只是 "catch" 将任何事件扔进房间。

就像我说的:这个线程似乎没有用,因为它什么也没做。完全没有。从不同的线程调用事件。你不需要这个。