如何使向量同步,使得从两个线程只有一个线程将访问它

时间:2011-09-21 04:55:32

标签: java multithreading synchronization

在我的程序中有两个类A和B,它们都扩展了Thread,现在B有一个名为CommandQueue的Queue。现在,线程B访问它,直到它变为空,并且只要找到要在其中插入的新命令,A类线程就会访问它。如何使这个队列同步,以便一次两个线程都无法访问它,并且当一个人使用了这个队列时,让另一个线程可以自由使用它。如果我没有同步,请建议是否有任何问题。

5 个答案:

答案 0 :(得分:3)

似乎你需要一个BlockingQueue而不是普通的Vector。

BlockingQueue.put(E e):将指定的元素插入此队列,等待空间变为可用。

BlockingQueue.take():检索并移除此队列的头部,必要时等待,直到元素可用。

答案 1 :(得分:2)

不清楚代码是使用Vector还是Queue。如果它的Vector始终同步,则此问题与Producer-Consumer问题非常相似。如果你研究那个

,它可能会有所帮助

答案 2 :(得分:1)

每当您想要一起使用线程和队列来执行工作时,ExecutorService很可能是最佳选择。这是因为它们旨在结合这两个概念。

ExecutorService es = Executors.new (pick a thread pool of your choice)

// in thread A
es.execute(new Runnable() {
   public void run() {
      // task to run on Thread B
   }
});

// in thread A
Future<Type> future = es.submit(new Callable<Type>() {
   public Type call() {
      // task to run on Thread B and ...
      return type;
   }
});

// later get the result
Type t = future.get();

注意:您不必直接引用队列或线程池,只需要说明您希望它做什么。

答案 3 :(得分:0)

您可以使用:ConcurrentLinkedQueue或带有wait / notify的其他集合。

予。的ConcurrentLinkedQueue

  ConcurrentLinkedQueue<Object> myQueue = new ConcurrentLinkedQueue<Object>();

  ...
  // first thread
  myQueue.add(someObject);

  ...
  // seconds thread
  Object someObject = myQueue.poll()

II。等待/通知

代码就是例如。您需要处理异常并阅读有关线程唤醒问题。

  ArrayList<Object> objects = new ArrayList<Object>();

  ...    
  // first thread
  synchronized(objects) {
      objects.add(someObject);
      objects.notifyAll();
  }

  ...
  // second thread
  synchronized(objects) {
      objects.wait();
      for (Object someObject: objects) {
          // do something with someObject
      }
  }

答案 4 :(得分:0)

只需添加“synchronized”即可同步线程。

public void synchronized Producer(Object whatever) {
    // Insert into the Queue here
     Queue.add(whatever);
}

public Object synchronized Consumer() {
    // Get Values out of the Queue here
    Queue.remove(whatever);
}

只需调用您需要的功能,一切运行正常并“完全同步”:)