--- a/openide.loaders/src/org/openide/loaders/FolderChildren.java Wed Nov 04 00:15:12 2015 +0000 +++ a/openide.loaders/src/org/openide/loaders/FolderChildren.java Wed Nov 04 16:30:09 2015 +0100 @@ -73,7 +73,7 @@ final class FolderChildren extends Children.Keys implements PropertyChangeListener, ChangeListener, FileChangeListener { /** the folder */ - private FolderList folder; + private final FolderList folder; /** filter of objects */ private final DataFilter filter; /** listener on changes in nodes */ @@ -169,13 +169,19 @@ } private enum RefreshMode {SHALLOW, SHALLOW_IMMEDIATE, DEEP, DEEP_LATER, CLEAR} - private void refreshChildren(RefreshMode operation) { + private final long[] lastRefreshes + = new long[RefreshMode.values().length]; + private void refreshChildren(final RefreshMode operation) { class R implements Runnable { List positioned = null; RefreshMode op; Task prevTask = null; + long creationTime; @Override public void run() { + if (wasCreatedBeforeLastRefresh()) { + return; + } if (prevTask != null) { // We need to ensure that refresh tasks for one // FolderChildren do not run in parallel. And because the @@ -208,6 +214,7 @@ } finally { err.log(Level.FINE, "refreshChildren {0}, done", op); } + storeLastRefreshTime(); } private List getPositionedFolderChildrenPairs() { @@ -228,6 +235,23 @@ } return list; } + + /** + * Check if this runnable was created before the last refresh for + * the current operation, and thus it is useless. + * + * @return True if this runnable is too old. + */ + private boolean wasCreatedBeforeLastRefresh() { + return creationTime < lastRefreshes[operation.ordinal()]; + } + + /** + * Store last refresh time for the current operation. + */ + private void storeLastRefreshTime() { + lastRefreshes[operation.ordinal()] = System.currentTimeMillis(); + } } R run = new R(); if (operation == RefreshMode.SHALLOW_IMMEDIATE) { @@ -238,7 +262,8 @@ run.op = operation; synchronized (this) { run.prevTask = refTask; - refTask = DataNodeUtils.reqProcessor(folder.getPrimaryFile()).post(run); + run.creationTime = System.currentTimeMillis(); + refTask = DataNodeUtils.reqProcessor(folder.getPrimaryFile()).post(run, 50); } } }