我使用观察者模式和BlockingQueue来添加一些实例。现在,在另一种方法我用了队列,但它似乎采取()永远等待,即使我做这件事是这样的:Observer - BlockingQueue
/** {@inheritDoc} */
@Override
public void diffListener(final EDiff paramDiff, final IStructuralItem paramNewNode,
final IStructuralItem paramOldNode, final DiffDepth paramDepth) {
final Diff diff =
new Diff(paramDiff, paramNewNode.getNodeKey(), paramOldNode.getNodeKey(), paramDepth);
mDiffs.add(diff);
try {
mDiffQueue.put(diff);
} catch (final InterruptedException e) {
LOGWRAPPER.error(e.getMessage(), e);
}
mEntries++;
if (mEntries == AFTER_COUNT_DIFFS) {
try {
mRunner.run(new PopulateDatabase(mDiffDatabase, mDiffs));
} catch (final Exception e) {
LOGWRAPPER.error(e.getMessage(), e);
}
mEntries = 0;
mDiffs = new LinkedList<>();
}
}
/** {@inheritDoc} */
@Override
public void diffDone() {
try {
mRunner.run(new PopulateDatabase(mDiffDatabase, mDiffs));
} catch (final Exception e) {
LOGWRAPPER.error(e.getMessage(), e);
}
mDone = true;
}
而mDiffQueue是的LinkedBlockingQueue,我使用它像这样的:
while (!(mDiffQueue.isEmpty() && mDone) || mDiffQueue.take().getDiff() == EDiff.INSERTED) {}
但我认为第一个表达式进行检查,而mDone是不正确的,那么也许mDone设置为true(观察者始终是多线程的?),但它已经调用mDiffQueue.take()? : -/
编辑:我真的不明白现在。我最近把它改成:
synchronized (mDiffQueue) {
while (!(mDiffQueue.isEmpty() && mDone)) {
if (mDiffQueue.take().getDiff() != EDiff.INSERTED) {
break;
}
}
}
如果我在调试器等待它的工作原理有点时间,但也应该在“实时”的工作,因为mDone被初始化为假,并因此而条件应是真的,身体应该被执行。
如果mDiffQueue为空且mDone为true,它应该跳过while循环的主体(这意味着队列不再被填充)。
编辑:看来,这是:
synchronized (mDiffQueue) {
while (!(mDiffQueue.isEmpty() && mDone)) {
if (mDiffQueue.peek() != null) {
if (mDiffQueue.take().getDiff() != EDiff.INSERTED) {
break;
}
}
}
}
即使我不明白为什么偷看()是强制性的。
编辑:
我想跳过所有插入的节点是什么,我做的是遍历树和:
for (final AbsAxis axis = new DescendantAxis(paramRtx, true); axis.hasNext(); axis.next()) {
skipInserts();
final IStructuralItem node = paramRtx.getStructuralNode();
if (node.hasFirstChild()) {
depth++;
skipInserts();
...
基本上计算树的最大深度或水平,而不考虑其中的节点已经在树的另一个版本中被删除(用于比较Sunburst可视化),但是好的,这可能超出范围。只是为了说明我正在做一些尚未插入的节点,即使它只是调整最大深度。
问候,
约翰内斯
mDone设置为true或false? – Scorpion
在diffDone()中,但我认为你忘了向下滚动? ;-) – Johannes