==Java 並行処理==
[[Java]]{{category 並行処理}}
==非同期に grep を実施する例1==
public static void main(String[] args) throws Exception {
if (args.length <<=2) {
System.out.println("Usage: java JGrep 対象ディレクトリ 正規表現 [ファイルフィルタ]");
System.exit(-1);
String fileFilter = "";
if (args.length > > 2) {
fileFilter = args[2];
}
int filesInBuketCnt = 0;
List<<List<<File>> >> buketBuket = new ArrayList<<List<<File>>>>(); List<<File> > fileBuket = null;
for (File file : files) {
if (filesInBuketCnt == 0) {
fileBuket = new ArrayList<<File>>();
}
fileBuket.add(file);
filesInBuketCnt++;
if (filesInBuketCnt > > buketSize) {
buketBuket.add(fileBuket);
filesInBuketCnt = 0;
}
}
if (files !=null && filesInBuketCnt > > 0) {
buketBuket.add(fileBuket);
}
int threadId = 1;
for (List<<File> > lstFiles : buketBuket) {
executer.execute(
new GrepCommand(threadId++,
int remain = workingThreadCount.addAndGet(-1);
System.out.println("残りのスレッド数... " + remain);
if ( remain <<= 0) {
System.out.println("終了しました。");
}
=====実行例11=====
> > java JGrep "C:\\work\\" ".*TEST.*" ".*\.txt$"
[006]処理中 ... WORK16.txt
public static void main(String[] args) throws Exception {
if (args.length <<=2) {
System.out.println("Usage: java JGrep 対象ディレクトリ 正規表現 [ファイルフィルタ]");
System.exit(-1);
String fileFilter = "";
if (args.length > > 2) {
fileFilter = args[2];
}
int filesInBuketCnt = 0;
List<<List<<File>> >> buketBuket = new ArrayList<<List<<File>>>>(); List<<File> > fileBuket = null;
for (File file : files) {
if (filesInBuketCnt == 0) {
fileBuket = new ArrayList<<File>>();
}
fileBuket.add(file);
filesInBuketCnt++;
if (filesInBuketCnt > > buketSize) {
buketBuket.add(fileBuket);
filesInBuketCnt = 0;
}
}
if (files !=null && filesInBuketCnt > > 0) {
buketBuket.add(fileBuket);
}
// Callable は、Runnabla と同じような役割を担うが、
// Runnable と異なり、結果を返し、例外をスローすることができる
List<<Callable<<Long>> >> tasks = new ArrayList<<Callable<<Long>>>>();
threadPool = Executors.newFixedThreadPool(THREAD_SIZE);
int threadId = 1;
for (List<<File> > lstFiles : buketBuket) {
tasks.add(
new GrepCommand(threadId++,
// 指定されたタスクを実行し、すべて完了すると、ステータスと結果を含む Future のリストを返す
List<<Future<<Long>> >> results = threadPool.invokeAll(tasks); for (Future<<Long> > f : results) {
System.out.printf("一致件数 %d 件\n", f.get().longValue());
}
* grep を実行する
*/
public static class GrepCommand implements Callable<<Long> > {
private int threadId;
private File[] files;