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