我有一个服务器/客户端应用程序,它使用许多线程来处理系统的各个方面。每次新客户端连接到服务器时,都会在ClientHandler
对象中创建一个新线程,用于管理服务器和客户端之间的通信。
一个单独的线程作为Calendar
对象的倒计时时钟,从服务器启动时开始,我想在这里进行某种线程间的通信。
这是检测截止日期何时过去的代码:
//Retrieve current date and time...
Calendar now = Calendar.getInstance();
//deadline not yet reached
while(now.before(deadline))
{
try
{
//wait a second and try again
sleep(1000);
}
catch (InterruptedException intEx)
{
intEx.printStackTrace();
}
//Update current date and time...
now = Calendar.getInstance();
//run loop again
}
在这个循环结束后,我想以某种方式告知其他线程已达到截止日期。
我对如何做到这一点感到有点失落。在我的程序的其他部分,我使用Socket
和Scanner/PrintWriter
作为输入和输出。这可能是可能的,但似乎是一种相当复杂的做事方式。
我做了一些研究,发现常用的是Java方法wait()
和notify()
。他们是否有可能完成我所追求的目标?如果没有,是否有比我已经提到过的更好的方式?
答案 0 :(得分:1)
您可以查看Observer模式。来自Wikipedia:
观察者模式是一种软件设计模式,其中一个称为主体的对象维护其依赖者列表,称为观察者,并通常通过调用其中一种方法自动通知它们任何状态变化。它主要用于实现分布式事件处理系统。
然后其他线程将订阅您的计时器线程。当达到截止日期时,计时器线程可以通知其他线程已达到截止日期。
例如,在你的Timer类中你将有一个方法:
public void subscribe(DeadlineListener listener) {
this.subscribers.add(listener); // subscribers is a List
}
然后截止日期监听器界面看起来像是以下几行:
public interface DeadlineListener {
public void onDeadlineReached();
}
在达到截止日期后,在您的Timer的运行方法中,您可以通知订阅者:
// Deadline has been reached
for (DeadlineListener listener : subcsribers) {
listener.onDeadlineReached();
}