在我的程序中有两个类A和B,它们都扩展了Thread,现在B有一个名为CommandQueue的Queue。现在,线程B访问它,直到它变为空,并且只要找到要在其中插入的新命令,A类线程就会访问它。如何使这个队列同步,以便一次两个线程都无法访问它,并且当一个人使用了这个队列时,让另一个线程可以自由使用它。如果我没有同步,请建议是否有任何问题。
答案 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);
}
只需调用您需要的功能,一切运行正常并“完全同步”:)