面白い状況を見つけました。あなたが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クラスで発生します。これは、入力データと、呼び出し元が必要とする処理のタイプによって異なります。
これを処理する適切な方法はありますか?もちろん、バックグラウンド処理スレッドを意図的に遅らせたり、譲ったりして、毎回少ない数が到着するようにすることはできますが、これは私にとって正しい解決策とは思えません。