2012-01-15 10 views
1

My Swingアプリケーションには、外部ソースからデータを取得するときに読み込まれるテーブルがあります。表示された結果が正しいとすべてがCPU使用率が100%であることを細かい間隔で動作しますSwingWorker:CPU使用率100%!

// SwingWorker Thread 
private class DisplayRowsTask extends SwingWorker<Void, Object[]> { 

    private Vector<String[]> _data; 

    @Override 
    protected Void doInBackground() { 
     while (_continue && !hasError()) { 
      // some logic to fetch and place data in _data 
      // data adjustment 
      for (String[] row : _data) publish (row); 
      _data = new Vector<String[]>(); 
     } 
     return null; 
    } 

    @Override 
    protected void process(List<Object[]> rows) { 
     for (Object[] row : rows) ((DefaultTableModel)_table.getModel()).addRow(row); 
    } 
} 

:データを表示するには、私はこの方法でデータをフェッチすることになっているスレッドから呼び出されたSwingWorkerのスレッドを使用しています(そして以上!)特に多くのデータが頻繁に取得される状況では、この使用法をどのように制限できますか?

別の質問が完全に関連していない可能性があります。データがテーブルに表示されているかどうかをどのように知ることができますか?メソッド「SwingWorker.isDoneは、()」あなたはぼんやりとrun()while (!task.isDone());をループしているので、あなたのCPUは当然100%、に上がっているこの情報

+2

本当にSwingWorkerのドキュメントを読んでください。メインスレッドは、SwingWorkerのいくつかのインスタンスをループして作成する必要はありません。 SwingWorkerはループし、テーブルを段階的かつ非同期的に移入する必要があります。メインスレッドではなく、データをフェッチする必要があるバックグラウンドスレッドです。 –

+0

ありがとう私は自分のコードを再編集しましたが、私はまだ100%のCPUを持っています。 – Randomize

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

1

に与えるものではありません。 SwingWorkerはを呼び出して非同期に実行されるため、Threadで実行する必要はありません。とにかくスイングでThreadを使用しないでください。 SwingWorkerはジョブを実行します。終了時にコードを呼び出すフックメソッドを持っています。 多くのタスクを実行する場合は、SwingWorkerでそれらを実装してください。 私はaddRow(...)火災のイベントを考える:別の質問へ

@Override 
    protected Void doInBackground() { 
     while (_continue && !hasError()) { 
     // do some adjustments around _data 
     for (String[] row : _data) publish (row); 
     } 
     return null; 
    } 

:このような

何か。あなたのテーブルはこのイベントを取得し、コンポーネントを無効にする必要があります。 SwingWorkerの後にコードを実行する場合は、done()メソッドをオーバーライドします。

+0

ありがとう私は自分のコードに類似している私のコードを再編集しましたが、まだ100%のCPU使用率を持っています: – Randomize

1

答えられない....

を使用すると、IDEユーザーであれば、私は実装により、100%のCPU使用率を生成することができませんEssential Java正しく、その後、あなたはビルトインを使用して、コードをプロファイルすることができますので、あなたが試さなかったものではないという考えJProfilerは、その後、そこに気づく程度Runnable#Thread、予告出力tにあなたの方法をラップすることによって)error from Future

2取る、しかし、基本的に次の3つの選択を書く

1)Executor & SwingWorkerを実装する必要があり、現在のJVMからのすべての重要なイベントを見ることができますGUIはinvokeLater

3にwrapedされなければならO)いくつかのThreadFactory or implements Executorを作成し、GUIへの通知出力)invokeAndWait

4に必要ないくつかのケースでinvokeLaterにwrapedされている必要がありますが、シミュレートすることができます/性能も問題と比較Christmas Tree Applications

関連する問題