0

我正在尝试处理以级联方式传递给两个线程的两个队列的同步。所以我有两个线程,一个监听来自客户端的连接的 ServerThread,另一个是在服务器线程接受来自客户端的连接的情况下创建的 ConnectedThread。我不知道如何将这些队列的传递同步到 ConnectedThread 类的线程构造函数。我应该同步这些队列吗?而且我不知道什么是最佳做法。我试图通过以下方式做到这一点:

synchronized (this) {
    new ConnectedThread(socket, inQueue, outQueue).start();
}

并通过:

synchronized (inQueue) {
    synchronized (outQueue) {
        new ConnectedThread(socket, inQueue, outQueue).start();
    }
}

一切当然都在"run()"ServerThread 类的 thread 方法中。

代码中的所有内容如下所示:

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 类的线程是在同步方法中创建的。

public synchronized void startServer(int port, Queue<ThreadMessage> in, 
        Queue<ThreadMessage> out) throws Exception {

    serverThread = new ServerThread(port, in, out);
    serverThread.start();
}

任何建议如何以适当的方式处理它?

预先感谢。

PS对不起我的英语。PS 队列是LinkedList

4

3 回答 3

1

您不需要同步将Queue实例引用分配给类成员。

您必须同步的是您对队列执行的操作,例如poll()offer()

同步有什么用?好吧,当有多个线程(在您的示例中ConnectedThread)与共享对象(在您的示例中为 in 和 out 队列)一起工作时,您必须同步操作,以便应用程序以线程安全的方式执行操作。

示例:如果两个线程要从一个队列中读取,并且它们都看到队列不为空(队列包含一个元素),它们都会调用poll它,但只有一个线程会从队列中获取元素。另一个线程将获取null并导致您的逻辑出现问题。因此,您必须同步队列的读取和写入操作。

于 2013-06-18T13:17:44.913 回答
0

同步仅在访问对象时有用(例如,浏览或修改队列时),而不是引用(即赋值或参数传递)。

您发布的代码没有提到如何处理队列。

于 2013-06-18T13:18:42.600 回答
0

还考虑使用 Java SE API 中存在的并发队列实现:队列实现教程页面

于 2013-06-19T10:54:43.680 回答