你可以使用進程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。工作進程可以簡單地維護一個進程標識列表(以及每個進程監聽的端口),併爲每個進程標識一個進程內的線程標識列表。
順便說一下,正如@帕爾西法爾所說,知道你實際上想要達到什麼會很有趣。
我認爲你的意思是「在一個特定的過程中獨一無二,但不是在不同的過程中」。 –
如果你描述你想解決的問題,而不是你的解決方案,你會得到更好的答案。我看不出一個很好的理由,你會*暴露一個真實的線索到外面的世界。相反,我會暴露線程將訪問的內容(例如,包含供線程讀取的標誌的JMX bean)。 – parsifal
@aasmumnd不......我的意思是我需要在所有流程實例中的整個應用程序中的線程ID唯一性。 @parsifal我相信這是我需要的,因爲它是一個更大的應用程序的一部分。這是一個較大案例的小模塊。 – prap19