2016-03-14 14 views
-1

我有一個服務器/客戶端應用程序,它使用多個線程來處理系統的各個方面。每當新客戶端連接到服務器時,將在管理服務器和客戶端之間的通信的對象ClientHandler中創建一個新線程。 一個單獨的線程作爲一個Calendar對象的倒計時時鐘,該對象從服務器啓動時開始,並且在這裏我希望進行某種線程間通信。提醒事件/操作的其他線程

這是當期限已過檢測代碼:

//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) 
     { 
      intEx.printStackTrace(); 
     } 

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

立即這個循環結束後,我想以某種方式通知的最後期限已經達到其他線程。

我對如何做到這一點有點遺憾。在我的程序的其他部分,我使用Socket s和Scanner/PrintWriter作爲輸入和輸出。這在這裏可能是可能的,但似乎是一個相當複雜的做事方式。

我做了一些研究,看到Java方法wait()notify()被普遍使用。他們會盡一切可能實現我所追求的目標嗎?如果沒有,是否有比我之前提到的更好的方法?

+0

如何使用Obser ver模式來通知訂戶,在這種情況下會是其他線程? –

+0

嗨,我相對較新的Java,所以我不熟悉這個功能。你介意闡述嗎? @WillyduPreez – marcuthh

回答

1

您可以查看觀察者模式。從Wikipedia

觀察者模式是一種軟件設計模式,其中一個對象,叫主題,保持其家屬,被稱爲觀察名單,並自動通知它們中的任何狀態變化,通常是通過調用之一他們的方法。它主要用於實現分佈式事件處理系統。

其他線程將訂閱您的計時器線程。到達截止日期時,計時器線程可以通知其他線程已達到截止日期。

舉個例子,在您的Timer類,你將有一個方法:

public void subscribe(DeadlineListener listener) { 
    this.subscribers.add(listener); // subscribers is a List 
} 

然後在截止日期監聽器接口看起來是沿着以下的說法:

public interface DeadlineListener { 
     public void onDeadlineReached(); 
} 

在您的Timer的運行方法一旦達到最後期限,您可以通知訂閱者:

// Deadline has been reached 
for (DeadlineListener listener : subcsribers) { 
     listener.onDeadlineReached(); 
} 
+0

謝謝你,我會試一試! – marcuthh

+0

雖然觀察者模式可能作爲更高級別的抽象,但這裏顯示的簡單機制並不能解決線程無法直接或通過事件接口列表調用的基本問題。 –

+0

事件處理程序雖然可能是其他類實例的成員,但它們將在啓動線程的上下文中調用,並且需要進一步的「實際」線程間通信來發信號通知其目標線程。我並不是說它是一個糟糕的設計,(它實際上是相當不錯的,因爲它將線程間通信封裝到它所屬的目標線程實例中),只是它比你描述的更復雜。 –

相關問題