2011-07-15 53 views
1

我目前正在實施一個程序,需要我來處理線程和進程。您可以分配唯一的線程ID並從外部程序訪問線程嗎?

IDEA:

  1. 有運行多個Java進程,每個進程可以具有多個線程。 當前的java實現是這樣的:java中的線程id對於特定的進程是唯一的,但不在進程內。那麼有沒有一種方法可以在多個進程中實現唯一的線程ID?

  2. 此外,我需要實現一個外部Java程序來監視這些線程。通過監視我的意思,根據一些邏輯,我需要通知一個特定的線程(使用唯一的線程ID)關於事件。有沒有一種方法可以從外部程序訪問線程?如果是的話如何?

  3. 是否有任何其他解決方案來實現類似的想法?

在此先感謝您。

+0

我認爲你的意思是「在一個特定的過程中獨一無二,但不是在不同的過程中」。 –

+2

如果你描述你想解決的問題,而不是你的解決方案,你會得到更好的答案。我看不出一個很好的理由,你會*暴露一個真實的線索到外面的世界。相反,我會暴露線程將訪問的內容(例如,包含供線程讀取的標誌的JMX bean)。 – parsifal

+0

@aasmumnd不......我的意思是我需要在所有流程實例中的整個應用程序中的線程ID唯一性。 @parsifal我相信這是我需要的,因爲它是一個更大的應用程序的一部分。這是一個較大案例的小模塊。 – prap19

回答

2

你可以使用進程ID和線程ID的級聯來唯一標識一個線程 - 例如,線程23過程7038可認定爲7038:23。這具有如下優點:給定一個線程標識符,可以知道該線程屬於哪個進程。

我懷疑一個進程可能控制另一個進程的線程。您可能需要使用某種形式的進程間通信,如RMI,命名管道或TCP。每個進程可能應該有一個線程,等待傳入的消息,解析它,並根據消息的內容通知適當的線程。

A 基於TCP的解決方案的簡單示例:每個工作進程都有一個線程,用於偵聽來自監視進程的TCP連接;預計當監視進程連接時,它將在該工作進程中寫入一行包含線程的標識。工作者程序必須保持例如一個HashMap,它將線程ID映射到Thread對象。

ServerSocket socket = new ServerSocket(6789); 
while (true) { 
    Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader socketReader = new BufferedReader(new InputStreamReader(
             connectionSocket.getInputStream())); 
    String line = socketReader.readLine(); 
    int threadId = Integer.parseInt(line); 
    // Now, use threadId to locate the appropriate thread 
    // and send a notification to it. 
} 

應該可能還有一種方法讓監視進程向工作進程詢問其所有線程ID。工作進程可以簡單地維護一個進程標識列表(以及每個進程監聽的端口),併爲每個進程標識一個進程內的線程標識列表。

順便說一下,正如@帕爾西法爾所說,知道你實際上想要達到什麼會很有趣。

+0

你能詳細說一下嗎? – prap19

+0

@ prap19:它的哪一部分? (什麼樣的闡述 - 是你有什麼不明白的,或者你想要代碼,...?) –

+0

你提到了RMI,命名管道和TCP。所以你可以解釋一下我可以把它與我的問題聯繫起來的方法。 – prap19

相關問題