Как 2 темы могут общаться друг с другом? - PullRequest
4 голосов
/ 31 июля 2011

Thread A суммирует данные, полученные от 10 клиентов.

while(true){
    Socket clientfd= server.accept ();
    BufferedReader message = new BufferedReader(new InputStreamReader (clientfd.getInputStream() ) );
    String val = message.readLine();
    this.sum_data+=(message.readLine();
    message.close ();
    clientfd.close ();
    this.left--;
    if(this.left==0){
        System.out.println(this.sum_data);
        break;
    }
}

Thread B постоянно общается с клиентами, независимо от того, живы они или нет (техника сердцебиения).

Дело в том, что клиенты иногда могут потерпеть неудачу, и в этом случае поток, которыйПодводя итоги, следует просто распечатать все возможные результаты от живых клиентов.В противном случае он никогда не распечатает результат.

Итак, если поток пульса обнаруживает, что один клиент не отвечает, есть ли способ сообщить другому потоку (или изменить переменную класса другого потока this.left)?

1 Ответ

8 голосов
/ 31 июля 2011

В принципе, существует два основных подхода к взаимодействию потоков:

  1. Общая память
  2. Событие / очередь на основе

В подходе с разделяемой памятью вы можете создать синхронизированный список или синхронизированную карту, из которой оба потока могут читать и записывать. Как правило, есть некоторые издержки, чтобы убедиться, что чтение и запись происходят без конфликтов, например, вы не хотите, чтобы объект, который вы читаете, был удален во время чтения. Java предоставляет коллекции, которые хорошо себя ведут, как Collections.synchronizedMap и Collections.synchronizedList.

В случае событий или потоков, связанных с потоками, потоки имеют входящие очереди и записывают их во входящие очереди других потоков. В этом сценарии у вас может быть поток пульса, загружающий очередь с клиентами для чтения, и другой поток запрашивает / извлекает из этой очереди и выполняет его обработку. Поток пульса может непрерывно добавлять в эту очередь клиентов, которые находятся в действии, чтобы поток обработки "знал", чтобы продолжить их обработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...