代码之家  ›  专栏  ›  技术社区  ›  mpmp

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

  •  3
  • mpmp  · 技术社区  · 9 年前

    我的代码:

    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 回复  |  直到 9 年前
        1
  •  4
  •   Nathan Hughes    9 年前

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

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

    类不拥有线程。当程序中的其他线程调用onEvent时,您的线程正在进行休眠、日志记录和标志检查。(同样,操作系统级线程是与保存为thread的引用的对象分开的东西。)

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

        2
  •  2
  •   Mark    9 年前

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

    倾听者不仅仅“捕捉”扔进房间的任何事件。

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