6

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)?

4

1 回答 1

9

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

  1. 共享内存
  2. 基于事件/队列

在共享内存方法中,您可以创建两个线程都可以读取和写入的同步列表或同步映射。通常,确保读取和写入不会发生冲突会产生一些开销,例如,您不希望在读取时删除正在读取的对象。Java 提供了行为良好的集合,例如Collections.synchronizedMapCollections.synchronizedList.

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

于 2011-07-31T01:35:55.580 回答