提醒事件/动作的其他线程

时间:2016-03-14 15:52:10

标签: java multithreading sockets

我有一个服务器/客户端应用程序,它使用许多线程来处理系统的各个方面。每次新客户端连接到服务器时,都会在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
    }

在这个循环结束后,我想以某种方式告知其他线程已达到截止日期。

我对如何做到这一点感到有点失落。在我的程序的其他部分,我使用SocketScanner/PrintWriter作为输入和输出。这可能是可能的,但似乎是一种相当复杂的做事方式。

我做了一些研究,发现常用的是Java方法wait()notify()。他们是否有可能完成我所追求的目标?如果没有,是否有比我已经提到过的更好的方式?

1 个答案:

答案 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();
 }