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

时间:2016-03-03 20:27:54

标签: 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 = 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课程仍然会发生事件。这是怎么发生的?由于线程处于睡眠状态,该类是否应该停止接收事件?

2 个答案:

答案 0 :(得分:4)

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

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

课程没有自己的主题。你的THREAD在进行休眠,日志记录和标志检查时正在旋转,而程序中的其他线程则调用onEvent。 (OS级别的线程与你保存为THREAD的引用的对象是分开的。)

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

答案 1 :(得分:2)

那个帖子似乎没用。我不知道你认为听众是如何工作的,但基本上他们只是引用你可能从未见过的某些线程如果发现某些事情就会用来调用某些方法。

聆听者并不只是"赶上"任何被扔进房间的事件。

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