我试图以级联方式处理传递给两个线程的两个队列的同步。所以我有两个线程,即侦听来自客户端的连接的ServerThread,以及在服务器线程从客户端接受连接的情况下创建的ConnectedThread。我不知道如何将这些队列的传递同步到ConnectedThread类的线程构造函数。我应该同步这些队列吗?我不知道最佳做法是什么。我尝试这样做:
synchronized (this) {
new ConnectedThread(socket, inQueue, outQueue).start();
}
并通过:
synchronized (inQueue) {
synchronized (outQueue) {
new ConnectedThread(socket, inQueue, outQueue).start();
}
}
当然,一切都在ServerThread类的"run()"
线程方法中。
代码中的所有内容都是这样的:
private class ServerThread extends Thread {
public ServerThread(int port, Queue<ThreadMessage> in,
Queue<ThreadMessage> out) throws Exception {
// TODO Auto-generated constructor stub
setName("ServerThread");
try {
server = new ServerSocket(port);
synchronized (in) {
synchronized (out) {
inQueue = in; outQueue = out;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new Exception();
}
}
private ServerSocket server;
private Queue<ThreadMessage> inQueue, outQueue;
private boolean running = true;
@Override
public void run() {
// TODO Auto-generated method stub
while (running) {
try {
Socket socket = server.accept();
synchronized (inQueue) {
synchronized (outQueue) {
try {
new ConnectedThread(socket, inQueue, outQueue)
.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
SeverThread类的线程是在synchronized方法中创建的。
public synchronized void startServer(int port, Queue<ThreadMessage> in,
Queue<ThreadMessage> out) throws Exception {
serverThread = new ServerThread(port, in, out);
serverThread.start();
}
有任何建议如何以适当的方式处理它?</ p>
提前感谢。
P.S。对不起我的英语不好。
附:队列是LinkedList
答案 0 :(得分:1)
您无需将Queue
个实例的引用分配同步到类成员。
您需要同步的是您在队列上执行的操作,例如poll()
或offer()
。
什么是同步有益?好吧,当有多个线程(在你的示例ConnectedThread
中)使用共享对象(在你的例子中是进出队列)时,你必须同步操作,以便应用程序以线程安全的方式执行操作。
示例:如果两个线程想要从队列中读取,并且它们都看到队列不为空(队列包含一个元素),则它们都将调用poll
在它上面,但只有一个线程将从队列中获取该元素。另一个线程将获得null
并导致逻辑问题。因此,您必须同步队列的读写操作。
答案 1 :(得分:0)
同步仅在访问对象时有用(例如,在浏览或修改队列时),而不是引用(即分配或参数传递)。
您发布的代码未提及如何处理队列。
答案 2 :(得分:0)
还要考虑使用Java SE API中存在的并发队列实现:Queue Implementations tutorial page