我正在编写一个我想要自包含的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似乎是这样做的,但我无法找到方法。
任何人都能解释一下吗?
答案 0 :(得分:1)
如果没有来自客户端线程(称为start()
)的明确合作,理论上你所要求的是理所当然的。只要停下来思考一下:主线程总是忙着运行一些特定的代码,在某些特定的方法中。完整的调用堆栈专用于当前调用。现在,您想要中断它并开始执行侦听器代码。
Swing实现此目的的方法是在Event Dispatch Thread中运行主事件循环。在此循环中,您可以想象Runnable
从队列中取出的实例以及依次调用它们的run
方法。只有当一个run
方法返回时,才能调用下一个。
这也是你需要为你的情况设计的,但我不确定你是否有类似的东西。唯一的选择是显式支持在外部线程上执行的侦听器方法。