2个线程如何相互通信?

时间:2011-07-31 01:25:36

标签: java sockets heartbeat

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 个答案:

答案 0 :(得分:8)

基本上,线程通信有两种常用方法:

  1. 共享内存
  2. 基于事件/队列
  3. 在共享内存方法中,您可以创建一个同步列表或同步映射,两个线程都可以读取和写入。通常情况下,确保读取和写入没有冲突会有一些开销,例如,您不希望在读取时读取的对象被删除。 Java提供了表现良好的集合,如Collections.synchronizedMapCollections.synchronizedList

    在事件或基于队列的线程通信中,线程具有传入队列并写入其他线程的传入队列。在这种情况下,您可能让心跳线程加载一个队列,客户端可以从中读取,并让另一个线程轮询/从该队列中获取并进行处理。心跳线程可以不断地将活动的客户端添加到此队列,以便处理线程“知道”继续处理它们。