2016-03-15 41 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

相關問題