我刚刚发现了一个有趣的情况。假设你有一些 SwingWorker (我让这个有点让人想起我自己的):
public class AddressTreeBuildingWorker extends SwingWorker<Void, NodePair> {
private DefaultTreeModel model;
public AddressTreeBuildingWorker(DefaultTreeModel model) {
}
@Override
protected Void doInBackground() {
// Omitted; performs variable processing to build a tree of address nodes.
}
@Override
protected void process(List<NodePair> chunks) {
for (NodePair pair : chunks) {
// Actually the real thing inserts in order.
model.insertNodeInto(parent, child, parent.getChildCount());
}
}
private static class NodePair {
private final DefaultMutableTreeNode parent;
private final DefaultMutableTreeNode child;
private NodePair(DefaultMutableTreeNode parent, DefaultMutableTreeNode child) {
this.parent = parent;
this.child = child;
}
}
}
如果在后台完成的工作很重要,那么事情就会很好 -process()
用相对较少的对象列表调用并且一切都很愉快。
问题是,如果在后台完成的工作由于某种原因突然变得微不足道,process()
会收到一个巨大的对象列表(例如,我见过 1,000,000 个),并且当您处理每个对象时,您已经在 Event Dispatch 上花费了 20 秒线程,正是 SwingWorker 旨在避免的。
如果不清楚,对我来说,这两者都发生在同一个 SwingWorker 类上——这取决于输入数据和调用者想要的处理类型。
有没有合适的方法来处理这个?显然,我可以故意延迟或让出后台处理线程,以便每次可能有更少的线程到达,但这对我来说并不是正确的解决方案。