2个线程如何相互通信?



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. 基于
  2. 事件/队列
在共享内存方法中,可以创建两个线程都可以读写的同步列表或同步映射。通常,要确保读和写没有冲突,会有一些开销,例如,您不希望在读取对象时删除它。Java提供了行为良好的集合,如Collections.synchronizedMapCollections.synchronizedList

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

相关内容

  • 没有找到相关文章

最新更新