我有一个服务器/客户机应用程序,它还包含一个计时器。服务器和客户端之间允许通信,直到达到截止时间(使用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///
///////////////////////////
}
这很粗糙,但希望沿着正确的路线。任何人都可以建议我怎么能够实现我以后的功能?
谢谢, 马克
我在研究过程中已经看到了堆栈溢出时的这个架构,但是这个项目是分级分配的一部分,我不能使用课程中未涉及的Java特性。你知道有一种方法可以做到与我所展示的类似吗?谢谢 – marcuthh
在这种情况下,您必须使用wait并通知。 – rahsan
为了详细阐述一下,没有进入太多的细节,因为它是一项任务,请看看这些机制是如何工作的。假设一个线程正在等待一个双线程应用程序,那么从另一个线程调用notify()会将其从等待状态中释放。您还需要在同一个对象上进行同步。所以基本上客户端和服务器需要同步虚拟对象在你的情况 – rahsan