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

Java 从工作线程调用侦听器方法,但让它在添加侦听器的线程上运行,java,multithreading,listeners,Java,Multithreading,Listeners,我正在编写一个TCP服务器类,希望它是自包含的。也就是说,使用此类的应用程序不必担心内部工作线程。TCP服务器类有一个start()方法,我希望能够在调用start()的同一线程上调用侦听器的方法(在正常使用下,是主线程)。下面的代码可能更好地解释了这一点: 公共类问题示例{ 私人倾听者; 公共问题示例(){ mListener=newlistener(){ @凌驾 public void fireListener(){ System.out.println(Thread.currentThre

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

公共类问题示例{
私人倾听者;
公共问题示例(){
mListener=newlistener(){
@凌驾
public void fireListener(){
System.out.println(Thread.currentThread().getName());
}
};
}
公开作废开始(){
mListener.fireListener();/“main”已打印
新线程(新辅助线程()).start();
}
公共接口侦听器{
public void fireListener();
}
私有类Worker实现了Runnable{
@凌驾
公开募捐{
/*假设侦听器正在用于状态更新,而
*线程正在运行,我想在
*与调用start()的线程相同。本质上
*开始操作时不需要知道或关心
*内螺纹*/
mListener.fireListener();/“线程-0”已打印
}
}
}
我试着搜索这个,但我不确定要搜索什么。我所发现的最好的方法是它似乎能做到这一点,但我不知道如何做到


有人能解释一下吗?

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

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


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

这怎么可能?假设出现一种极端情况,例如,起始线程已终止。如何从一个线程判断另一个线程应该做什么?考虑使用队列或Excel服务。顺便说一句,你的问题并不能说明你要解决的实际问题。好的,谢谢,谢谢。因为我打算重新使用这个TCP服务器,所以我认为它的设计会更好,它不允许侦听器阻止工作线程,如果侦听器正在更新UI,它也会更好地与Swing应用程序配合使用。那么,最好的做法是从工作线程调用侦听器,并将其保持在该状态吗?如果您的目标是在Swing EDT中调用侦听器,那么当您要调用侦听器时,只需让工作线程使用SwingUtilities.invokeLater()。这不会阻塞工作线程,并且侦听器将在EDT中调用。但是,为了能够用任何类型的线程实现这一点,那么你需要线程的协作。就在最近,我做了一个项目,在这个项目中,我可以将工作队列和
同步
方法并排进行比较,
同步
方法的优点是,由于锁的重新进入,它的组合更好。它也更容易实现:只需使用
synchronized
关键字。另一方面,由于操作的细粒度,Swing最好使用工作队列。因此,没有单一的最佳实践:了解这两种方法的优缺点,并部署最适合的方法。