Я только что нашел интересную ситуацию. Предположим, у вас есть какой-то 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) и к тому времени, когда вы обрабатываете каждый объект, вы потратили 20 секунд в потоке рассылки событий, именно то, что SwingWorker был разработан, чтобы избежать.
В случае, если неясно, оба они происходят в одном и том же классе SwingWorker для меня - это зависит от входных данных и типа обработки, которую хотел вызывающий.
Есть ли правильный способ справиться с этим? Очевидно, я могу намеренно задержать или выдать поток фоновой обработки, чтобы каждый раз приходило меньшее число , но для меня это не является правильным решением.