2011-07-31 175 views
4

Thread A正在总结从10个客户端传来的数据。2个线程如何相互沟通?

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

回答

8

基本上有线程通信两种一般的方法:

  1. 共享存储器
  2. 基于

在共享存储器的方法,可以创建AA同步列表

  • 事件/队列或两个线程都可以读取和写入的同步映射。通常,确保读取和写入不会发生冲突会导致一些开销,例如,您不希望在阅读时删除正在阅读的对象。 Java提供了很好的集合,如Collections.synchronizedMapCollections.synchronizedList

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