我试图处理以级联方式传递给两个线程的两个队列的同步。因此,我有两个线程,一个是侦听来自客户端的连接的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();
}
有什么建议如何妥善处理吗?
提前感谢。
注:对不起,我的英语不好。附注:这些队列是LinkedList
不需要同步Queue
实例对类成员的引用赋值。
您必须同步的是您在队列上执行的操作,如poll()
或offer()
。
同步对什么有好处?好吧,当有多个线程(在您的示例ConnectedThread
中)与共享对象(在您的示例中是in和out队列)一起工作时,您必须同步操作,以便应用程序以线程安全的方式执行操作。
示例:如果两个线程都想从队列中读取,并且它们都看到队列不是空的(队列中包含一个元素),它们都将在队列中调用poll
,但是只有一个线程将从队列中获取元素。另一个线程将获得null
并在您的逻辑中导致问题。因此,必须同步队列的读写操作。
同步只在访问对象(例如,浏览或修改队列)时有用,而不是在引用(即赋值或参数传递)时有用。
你发布的代码没有提到如何处理队列
还可以考虑使用Java SE API中存在的并发队列实现:队列实现教程页