从工作线程调用侦听器方法,但让它在添加侦听器的线程上运行

时间:2012-12-14 09:11:54

标签: java multithreading listeners

我正在编写一个我想要自包含的TCP服务器类。也就是说,使用此类的应用程序不必担心内部工作线程。 TCP服务器类有一个start()方法,我希望能够在调用start()的同一个线程上调用监听器的方法(正常使用时,主线程)。用代码可能更好地解释了这一点:

public class ProblemExample {
    private Listener mListener;

    public ProblemExample() {
        mListener = new Listener() {
            @Override
            public void fireListener() {
                System.out.println(Thread.currentThread().getName());
            }
        };
    }

    public void start() {
        mListener.fireListener(); // "main" is printed
        new Thread(new Worker()).start();
    }

    public interface Listener {
        public void fireListener();
    }

    private class Worker implements Runnable {
        @Override
        public void run() {
            /* Assuming the listener is being used for status updates while
             * the thread is running, I'd like to fire the listener on the
             * same thread that called start(). Essentially, the thread that
             * starts the operation doesn't need to know or care about the
             * internal thread. */
            mListener.fireListener(); // "Thread-0" is printed
        }
    }
}

我已尝试搜索此内容,但我不确定要搜索的内容。我发现最好的是SwingWorker似乎是这样做的,但我无法找到方法。

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:1)

如果没有来自客户端线程(称为start())的明确合作,理论上你所要求的是理所当然的。只要停下来思考一下:主线程总是忙着运行一些特定的代码,在某些特定的方法中。完整的调用堆栈专用于当前调用。现在,您想要中断它并开始执行侦听器代码。

Swing实现此目的的方法是在Event Dispatch Thread中运行主事件循环。在此循环中,您可以想象Runnable从队列中取出的实例以及依次调用它们的run方法。只有当一个run方法返回时,才能调用下一个。

这也是你需要为你的情况设计的,但我不确定你是否有类似的东西。唯一的选择是显式支持在外部线程上执行的侦听器方法。