はじめに
テスト用クライアントアプリで、定義ファイルの内容を順に送信するだけでなく、複数同時に送信する必要が生じた。別々のスレッドで処理するための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で開発していました。これまでのクラス設計の考え方を転換しないといけませんね。