Можете ли вы назначить уникальные идентификаторы потоков и получить доступ к потоку из внешней программы? - PullRequest
1 голос
/ 15 июля 2011

В настоящее время я реализую программу, которая требует от меня обработки потоков и обработки.

ИДЕЯ:

  1. Работает несколько процессов Java, и каждый процесс может иметь несколько потоков. Текущая реализация Java такова, что идентификаторы потоков в java уникальны для конкретного процесса, но не внутри процессов. Так есть ли способ, которым я мог бы реализовать уникальные идентификаторы потоков среди нескольких процессов?

  2. Кроме того, мне нужно реализовать внешнюю Java-программу, которая отслеживает эти потоки. Под мониторингом я подразумеваю, что в зависимости от некоторой логики мне нужно уведомить конкретный поток (используя уникальный идентификатор потока) о событии. Есть ли способ, которым я могу получить доступ к потоку из внешней программы. Если да, то как?

  3. Существуют ли другие решения для реализации подобной идеи?

Заранее спасибо.

1 Ответ

2 голосов
/ 15 июля 2011

Вы можете использовать объединение идентификатора процесса и идентификатора потока для уникальной идентификации потока - например, поток 23 в процессе 7038 может быть идентифицирован как 7038:23.Это имеет то преимущество, что, учитывая идентификатор потока, вы можете сказать, какому процессу принадлежит поток.

Я сомневаюсь, что один процесс может управлять потоками другого.Вам, вероятно, нужно использовать какую-то форму межпроцессного взаимодействия, например RMI , именованные каналы или TCP.Каждый процесс, вероятно, должен иметь один поток, который ожидает входящее сообщение, анализирует его и уведомляет соответствующий поток на основе содержимого сообщения.

A очень простой пример того, что такое TCPрешение на основе может выглядеть следующим образом: каждый рабочий процесс имеет поток, который прослушивает TCP-соединения из процесса мониторинга;ожидается, что при подключении процесса мониторинга он напишет одну строку, содержащую идентификатор потока в этом рабочем процессе.Рабочий процесс должен сохранять, например, HashMap, который сопоставляет идентификаторы потоков с 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.
}

Вероятно, у процесса мониторинга должен быть способ запрашивать у рабочего процесса все идентификаторы потоков,Рабочий процесс может просто поддерживать список идентификаторов процессов (и какой порт прослушивает каждый процесс) и, для каждого идентификатора процесса, список идентификаторов потоков внутри этого процесса.

Кстати, @parsifalсказал, что было бы интересно узнать, чего вы на самом деле пытаетесь достичь.

...