客户端有一个消息队列 发消息都是 msg.add(byte[]) 然后每次发送前输出 msg.size() 发送完就 remove 但是每次 msg.size 都在变大
用调试看,也确实跑到了 remove 的位置
然后我就发现了很诡异的情况 1.调试状态下服务端能收到消息,客户端的 size 也有在减小,消息有发出去 2.正常状态运行,似乎客户端的消息 write 不到 OutputStream 3.在每次发送消息前加一句 sout,消息就可以正常发出去和被收到,但是用 Thread.sleep 不行
注:收消息发消息我都是专门建了一个 Thread 跑的。 猜测是不是出现了线程安全问题呢? 头疼 怎么调试都调试不出来
贴出发送消息线程的代码:
package com.lmyun.socket.thread;
import com.lmyun.socket.SocketUtils;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;
public class SocketSendThread extends Thread {
private Socket socket;
private List<byte[]> msg;
public SocketSendThread(Socket socket) throws IOException {
this.socket = socket;
this.msg = new LinkedList<>();
}
@Override
public void run() {
while (true) {
//System.out.println(this.msg.size());
if (msg.size() == 0) {
continue;
}
try {
this.sendMsg(msg.get(0));
} catch (IOException e) {
e.printStackTrace();
}
msg.remove(0);
}
}
public void addMsg(byte[] msg) {
this.msg.add(msg);
System.out.println(this.msg.size());
}
public void sendMsg(byte[] b) throws IOException {
OutputStream os = this.socket.getOutputStream();
os.write(SocketUtils.IntToByte(b.length));
os.write(b);
os.flush();
}
}
1
mind3x 2018-11-13 21:11:54 +08:00
施主你可知道 LinkedList 不是线程安全的?
好歹也用个 ArrayBlockingQueue 或者 LinkedBlockingQueue 吧 |
4
misaka19000 2018-11-13 21:21:42 +08:00
remove 方法不改变 size 吧好像
|