use*_*594 4 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;
}
}
Run Code Online (Sandbox Code Playgroud)
Thread B
不断与客户沟通,无论他们是否活着(心跳技术).
问题是客户端有时会失败,在这种情况下,总结数据的线程应该只打印出来自活动客户端的所有可能结果.否则,它将永远不会打印出结果.
所以,如果heartbeat线程注意到一个客户端没有响应,是否有办法告诉其他线程(或更改其他线程的类变量this.left
)?
基本上,线程通信有两种通用方法:
在共享内存方法中,您可以创建一个同步列表或两个线程可以读取和写入的同步映射.通常,确保读取和写入没有冲突会有一些开销,例如,您不希望在读取时读取的对象被删除.Java提供了表现良好的集合,例如Collections.synchronizedMap
和Collections.synchronizedList
.
在事件或基于队列的线程通信中,线程具有传入队列并写入其他线程的传入队列.在这种情况下,您可能让心跳线程加载一个队列,客户端可以从中读取,并让另一个线程轮询/从该队列中获取并进行处理.心跳线程可以不断地向该队列添加活动的客户端,以便处理线程"知道"继续处理它们.
归档时间: |
|
查看次数: |
4714 次 |
最近记录: |