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

时间:2013-06-18 13:12:41

标签: java multithreading synchronization

我试图以级联方式处理传递给两个线程的两个队列的同步。所以我有两个线程,即侦听来自客户端的连接的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

的实例

3 个答案:

答案 0 :(得分:1)

您无需将Queue个实例的引用分配同步到类成员。

您需要同步的是您在队列上执行的操作,例如poll()offer()

什么是同步有益?好吧,当有多个线程(在你的示例ConnectedThread中)使用共享对象(在你的例子中是进出队列)时,你必须同步操作,以便应用程序以线程安全的方式执行操作。

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

答案 1 :(得分:0)

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

您发布的代码未提及如何处理队列。

答案 2 :(得分:0)

还要考虑使用Java SE API中存在的并发队列实现:Queue Implementations tutorial page