假设在下面的例子中,deleteItems
(消费者)和addItem
(生产者)用于多个线程在map
中删除和添加项目。
class Test {
public static SparseIntArray map = new SparseIntArray();
// deleteItems is invoked every 10 seconds
public static void deleteItems() {
synchronized(Test.class) {
// Iterate over the items in the map and delete some
}
}
// addItem is invoked frequently
public static void addItem(int key, int value) {
// Add an item into the map
}
}
我希望实现以下两个目标:
(1) 当调用 deleteItems
时,任何要使用 addItem
的线程都会被阻塞。
(2) 当 deleteItems
未被调用时,任何线程都可以使用 addItem
将新项目放入 map
。 (因为效率问题我不想同步addItem
)
有没有可能实现我想要的?
答案 0 :(得分:1)
所以也许(如果我理解正确的话)你需要这样的东西:
您需要一个标志,用于让线程等待删除线程结束其工作。 “删除”线程也是如此,它必须等待添加线程完成。所以这就是想法:)
class Test {
private SparseIntArray map = new SparseIntArray();
private boolean isDeleting = false;
private int threadsAdding = 0;
public synchronized void deleteItems() {
while(threadsAdding != 0) { wait(); }
isDeleting = true;
...
exitDeleting();
}
public void addItem(int key, int value) throws InterruptedException {
while (isDeleting) { wait(); }
threadsAdding++;
...
exitAdding();
}
private void exitDeleting() {
isDeleting = false;
notifyAll();
}
private void exitAdding() {
threadsAdding--;
notifyAll();
}
}
如果我错过了什么,请告诉我,以便我们讨论。
希望它有所帮助:) 祝你好运。