我有一个服务器/客户端应用程序,其中还包含一个计时器。服务器和客户端之间允许通信,直到达到截止时间(使用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 :(得分:0)
我认为这里的问题是建筑问题,而不是其他问题。 如果您更喜欢使用Java的排队机制,那么这里的解决方案非常简单。
在客户端和服务器之间建立消息传递结构。这可以使用BlockingQueue轻松实现。
在主应用程序中初始化BlockingQueue:
BlockingQueue<String> queue = new ArrayBlockingQueue<String>();
为客户端和服务器应用程序提供队列。
在服务器应用程序的while循环中执行以下操作:
String clientMessage = """;
while(true){
clientMessage = queue.take();
}
请注意,在一个字符串元素可用之前,队列就会占用块。
在客户端应用程序中,现在只需在到达截止日期时在队列中插入一个字符串,服务器将自动得到通知。