我正在编程一个多线程服务器,并且每个客户端套接字连接都有一个线程。我想将数据从主线程来回传递给客户端线程。
我必须设置多少个线程?
它是这样工作的吗?
[服务器类别:]
private PipedInputStream serverInputStream = new PipedInputStream();
private PipedOutputStream serverOutputStream = new PipedOutputStream();
public PipedInputStream clientInputStream = new PipedInputStream();
public PipedOutputStream clientOutputStream = new PipedOutputStream();
serverInputStream.connect(clientOutputStream);
clientInputStream.connect(serverOutputStream);
还是我必须为每个客户端设置这四个流?
我很抱歉这个问题可能是愚蠢的,但是我已经将其视为可能并尝试了。如果有更好的方法来处理线程之间的通信,请教育我!
我写了一个小类,等待缓冲读取器阻塞并将消息添加到队列中:
public class DataListener implements Runnable {
private InputStream is;
private ConcurrentLinkedQueue<String> messages;
private boolean closed = false;
public DataListener(InputStream is, ConcurrentLinkedQueue<String> messages) {
this.is = is;
this.messages = messages;
}
@Override
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (!closed) {
try {
messages.add(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void close() {
closed = true;
}
}
您能告诉我这是否是解决阻塞的侦听器的好方法吗?
使用流将数据从一个线程传递到另一个线程绝对不是一个好主意,因为:
如果要经常在线程之间传递数据,请尝试不惜一切代价避免阻塞,因为否则服务器线程将在大多数时间等待。Java提供了广泛的非阻塞数据交换功能工具集,您可以使用它来代替,您可以在Concurrent Package中找到它。
一种非常简单但有效且快速的数据交换方法是使用消息样式系统:
final ConcurrentLinkedQueue<MyMessageClass> messages = new ConcurrentLinkedQueue<MyMessageClass>();
public void addMessage(final MyMessageClass message) {
messaged.add(message);
}
protected void serverLoop() {
//...
final MyMessageClass message = messages.poll(); // does not block, returns null if none is available
if (message != null) {
handleMessage(message);
}
//...
}
您可以将类之类LinkedBlockingQueue
用于其他功能,例如临时阻止。
但是,在线程化方面,大多数问题只能通过针对当前问题使用正确的体系结构来解决。对于所有线程任务,都没有“金锤子”解决方案,如果您希望代码完美运行,则需要找到适当的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句