Javaのスレッド処理に関するメモ。
呼び出す側だけを変更すれば対応可能です。
今回の例では1ファイルをタスクに渡しているので、
大量ファイルで1ファイル内のレコード量が少ない時に効果が出ます。
1ファイルで1ファイル内のレコード量が多い場合、タスクに渡す単位を考えた方が良いです。
- 呼び出す側
public static void main(String[] args) { Z_Thread main = new Z_Thread(); // スレッド管理サービスを生成する。 ExecutorService multiExecutor = Executors.newFixedThreadPool(2); main.executeMultiTask(multiExecutor); // スレッドを終了する。 multiExecutor.shutdown(); }
private void executeMultiTask(ExecutorService serviceExecutor) { // 戻り値を定義する。 List<Future<Long>> futures = new ArrayList<Future<Long>>(); Future<Long> future = null; try { String fileDir = "D:\\"; String fileName = ""; // 指定ディレクトリの「*.txt」の一覧を取得する。 Path path = Paths.get(fileDir); try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path, "*.txt")) { // 指定ディレクトリの「*.txt」数分繰り返す。 for (Path p : directoryStream) { // ファイル名を取得する。 fileName = p.getFileName().toString(); // 取得したファイル名をタスクに登録する。 // タスクはCallableを利用することで戻り値と例外を受け取れるようにする。 // タスクはRunnableを利用すると戻り値と例外は受け取れない。 Future<Long> future = serviceExecutor.submit(new CallableTest(fileDir, fileName)); futures.add(future); } } catch (IOException e) { System.out.println("IO例外"); } // 結果を順次取得する。 for (Future<Long> futureResult : futures) { Long result = futureResult.get(20000, TimeUnit.MILLISECONDS); System.out.println("結果:" + result + ":スレッドの結果を受け取りました。"); } } catch (InterruptedException e){ System.out.println("割り込み例外"); } catch (ExecutionException e) { System.out.println("タスクの中で例外発生"); } catch (TimeoutException e) { System.out.println("タイムアウト例外発生"); } catch (Exception e) { System.out.println("何かの例外発生") } finally { future.cancel(true); } }