【Java】マルチスレッド処理

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);
        }
    }