4

我正在编写一个我想要自包含的 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似乎可以做到这一点,但我不知道怎么做。

任何人都可以解释一下吗?

4

1 回答 1

1

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

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

这也是您需要为您的案例设计的内容,但我不确定您是否有类似的想法。唯一的选择是显式支持在外部线程上执行的侦听器方法。

于 2012-12-14T09:28:25.843 回答