如何同步两个队列到线程构造函数的传递



我试图处理以级联方式传递给两个线程的两个队列的同步。因此,我有两个线程,一个是侦听来自客户端的连接的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中存在的并发队列实现:队列实现教程页

最新更新