방금 흥미로운 상황을 발견했습니다. 일부 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 클래스에서 발생합니다. 입력 데이터와 호출자가 원하는 처리 유형에 따라 다릅니다.
이 문제를 해결할 적절한 방법이 있습니까? 분명히 을 의도적으로 지연 처리하거나 백그라운드 처리 스레드를 생성하여 더 작은 숫자 이 일 때마다 도착할 수 있지만 이는 나에게 맞는 해결책이 아닐 수 있습니다.