2016-03-15 126 views
0

我有一个服务器/客户机应用程序,它还包含一个计时器。服务器和客户端之间允许通信,直到达到截止时间(使用Calendar对象)。在达到这一最后期限是在一个单独的线程,从服务器调用监控:按另一个状态在一个线程中触发函数

//create and run a timer on bid items 
public static void startClock() 
{ 
    //thread to track item deadlines 
    DeadlineClock deadlineClock = 
      new DeadlineClock(deadline); 
    //begin running the clock 
    deadlineClock.start(); 
} 

然后截止检测,像这样:

//inside DeadlineClock's run() method 

    //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) 
     { 
      //Do nothing. 
     } 

     //Update current date and time... 
     now = Calendar.getInstance(); 
     //run loop again 
    } 

我想这样做是有(在服务器中)在DeadlineClock中达到截止日期的方式,但我完全无法找到一个可实现的方式来完成此操作,而没有完全复制服务器中的整个计时机制。

从我所知道的情况来看,它基本上会在DeadlineClock一侧获得某种输出或返回一个值,但我不知道如何在服务器端读入或检测到这个值,而且这也会如果该计划涉及多个截止日期,则难以扩展规模。

我唯一的其他想法是一个布尔变量传递到DeadlineClock构造函数,然后尝试和等待,以检测是否该改变了,这样的事情(假设一旦最后期限达成的变量的值被改变):

//create and run a timer on bid items 
public static void startClock() 
{ 
    //initialise as false before items run 
    boolean deadlineReached = false; 

    //thread to track item deadlines 
    DeadlineClock deadlineClock = 
      new DeadlineClock(deadline, deadlineReached); 
    //begin running the clock 
    deadlineClock.start(); 

    //monitor other thread for value change 
    while (deadlineReached != true) 
    { 
     //do nothing until changed 
     wait(); 
    } 
    /////////////////////////// 
    ///CHANGE DECTECTED HERE/// 
    /////////////////////////// 
} 

这很粗糙,但希望沿着正确的路线。任何人都可以建议我怎么能够实现我以后的功能?

谢谢, 马克

回答

0

我觉得这里的问题是一个建筑之一,比什么都重要。 如果您更喜欢使用Java的排队机制,这里的解决方案非常简单。

在客户端和服务器之间建立消息传递结构。这可以使用BlockingQueue轻松实现。

初始化的BlockingQueue的主要应用:

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(); 

提供队列客户端和服务器应用程序。

在服务器应用程序的同时,循环执行以下操作:

String clientMessage = """; 


while(true){ 
clientMessage = queue.take(); 
} 

注意,在起飞块排队,直到一个字符串元素变得可用。

在客户端应用程序现在只需在到达截止日期时在队列中插入字符串,服务器将自动得到通知。

+0

我在研究过程中已经看到了堆栈溢出时的这个架构,但是这个项目是分级分配的一部分,我不能使用课程中未涉及的Java特性。你知道有一种方法可以做到与我所展示的类似吗?谢谢 – marcuthh

+0

在这种情况下,您必须使用wait并通知。 – rahsan

+0

为了详细阐述一下,没有进入太多的细节,因为它是一项任务,请看看这些机制是如何工作的。假设一个线程正在等待一个双线程应用程序,那么从另一个线程调用notify()会将其从等待状态中释放。您还需要在同一个对象上进行同步。所以基本上客户端和服务器需要同步虚拟对象在你的情况 – rahsan

相关问题