[Java][並行処理]
SwingWorkerを利用する
- バッググラウンドで複数のログファイルを処理するシナリオ
File[] logs = chooser.getSelectedFiles();
LogAnalyzeWorker worker = new LogAnalyzeWorker(txtOut, logs); // txtOut : JTextArea
worker.execute();
List<String> result = worker.get();
public static class LogAnalyzeWorker extends SwingWorker<List<String>, String> {
private File[] logs;
private JTextArea txtOut;
public LogAnalyzeWorker(JTextArea txtOut, File[] logs) {
this.logs = logs;
this.txtOut = txtOut; // 結果表示先
}
@Override
protected List<String> doInBackground() throws Exception {
List<String> result = new ArrayList<String>();
for (File log : logs) {
publish(log.getName()); // process() で取得できる処理状態の情報を返す
result.add(log.getName());
// 時間がかかる処理本体
LogAnalyzer analyzer = new AccessLogAnalyzer();
analyzer.analyze(log);
}
// get() で取得できる結果を返す
return result;
}
@Override
protected void process(List<String> chunks) {
// publish() で設定した内容がリストで取得できるので、GUIに書き出す
for (String logout : chunks) {
txtOut.append(logout + "\n");
}
}
}
YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto
Copyright© 矢木 浩人 All Rights Reserved.