LoginSignup
1
1

More than 5 years have passed since last update.

Runnableは別スレッドで実行するためだけのインタフェースではなかったと気づきました

Last updated at Posted at 2017-08-04

はじめに

テスト用クライアントアプリで、定義ファイルの内容を順に送信するだけでなく、複数同時に送信する必要が生じた。別々のスレッドで処理するためのRunnable実装クラスをリストに入れてそれらを別スレッドで実行するような実装をした時、これをそのまま順に実行すれば順次実行となることに気づきました。

目次

1.はじめに
2.目次
3.いまさらながら
4.おわりに

いまさらながら

Runnableは別スレッドで実行する処理の起点としてしか使ったことがありませんでしたが、そのままrun()メソッドを呼び出せば同じスレッドで処理が行われるということにいまさらながら気づいたということです。

Runner.java
    public void start() {
        List<Runnable> runnables = new ArrayList<>();
        for (String line : getLines()) {
            runnables.add(createRunnable(line));
        }

        log.debug("同一スレッド順次実行");
        runnables.forEach(r -> r.run());

        log.debug("複数スレッド同時実行");
        runnables.forEach(r -> new Thread(r).start());
    }

    private String[] getLines() {
        return new String[] {
            "Hello",
            "Hi",
            "How are you",
            "Bye"
        };
    }

    private Runnable createRunnable(String line) {
        // lineの内容によって実行する処理が異なる的な
        if (line.length() < 5) {
            return () -> process(line, "***");
        }
        else {
            return () -> process(line);
        }
    }

    private void process(String line) {
        log.debug(Thread.currentThread().getId() + ": "+ line);
    }

    private void process(String line, String deco) {
        process(deco + line + deco);
    }

おわりに

最近ようやくJava8を触るようになり、勉強中です。携わってきたプロジェクトの都合によりこれまでずっとJava6で開発していました。これまでのクラス設計の考え方を転換しないといけませんね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1