2010-05-28 2 views
3

방금 ​​흥미로운 상황을 발견했습니다. 일부 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 클래스에서 발생합니다. 입력 데이터와 호출자가 원하는 처리 유형에 따라 다릅니다.

이 문제를 해결할 적절한 방법이 있습니까? 분명히 을 의도적으로 지연 처리하거나 백그라운드 처리 스레드를 생성하여 더 작은 숫자 일 때마다 도착할 수 있지만 이는 나에게 맞는 해결책이 아닐 수 있습니다.

답변

4

작은 덩어리의 결과를 게시 할 수 있습니다.

그래도 도움이되지 않으면 계산 대신 UI 업데이트를 조절할 수도 있습니다. 넌 process에 스토어가 블로킹 큐에 수신 NodePairs 구비하여 UI 업데이트를 검토 할 수 :

@Override 
protected Void doInBackground() { 
    this.treeModelUpdater.execute(); 
    // Omitted; performs variable processing to build a tree of address nodes. 
} 

@Override 
protected void process(List<NodePair> chunks) { 
    this.queue.addAll(chunks); // a blocking queue 
} 

@Override 
protected void done() { 
    // Null Object as sentinel value to unblock TreeModelUpdater 
    // and signal it to end doInBackground. 
    this.queue.put(new NullNodePair()); 
} 

TreeModelUpdater하면 (this.treeModelUpdater)는 다음 하위 SwingWorker의 구현 doInBackground있어서 검색하여 큐에서 NodePairs 게시 될 감속 된 방식으로.

2

내가 아는 한 프로세스 방법은 주로 백그라운드 처리 결과로 UI를 업데이트하는 것입니다. 1Mio 덩어리의 경우, 그 정보가 화면 어디에서 나올지 궁금합니다. :-)

큰 목록에 청크를 함께 배치하고 적어도 동기화 부분이 크게 줄어들도록 처리하기 위해이를 전송합니다.

컨트롤을 사용하여 1Mio 데이터 요소를 표시 할 수 있어야하는 경우 지연 표현 기법을 사용하지 않는 한 실제로 성능이 저하됩니다. 즉 실제로 볼 수있는 항목 만 인스턴스화합니다. 이 경우 프로세스 루틴에 더 이상 과부하가 걸리지 않습니다.

관련 문제