我有一個服務器/客戶機應用程序,它還包含一個計時器。服務器和客戶端之間允許通信,直到達到截止時間(使用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