演習課題「newSingleThreadExecutorを使ってみよう」
ExecutorServiceインタフェースのnewSingleThreadExecutorを使用してt1、t2、t3を1つのスレッドで実行し、各アルファベッド(a、b、c)が混ざることなく出力されるようにしてください。
また、ExecutorServiceのsubmitメソッドを使用して、結果をあらわすFutureインスタンスを取得しましょう。各Futureインスタンスは以下のようにしてください。
t1: Runnableを引数に取り、タスクが正常に完了するとnullを返す。
t2: RunnableとTを引数に取り、タスクが正常に完了するとTを返す。
t3: Callableを引数に取り、タスクが正常に完了するとタスクの実行結果を返す。
なお、コンパイルコマンドについて理解できれいれば、以下のコマンドをコピーして利用してください。
javac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
また、実行コマンドについて理解できていれば、以下の実行コマンドをコピーして利用してください。
java -p classes --module jp.paiza.thread/jp.paiza.thread.TEST
期待する出力値
a0
a1
a2
a3
a4
f1:null
b0
b1
b2
b3
b4
f2:true
c0
c1
c2
c3
c4
f3:true
演習課題「newFixedThreadPoolを使ってみよう」
ExecutorServiceインターフェースのnewFixedThreadPoolを使用してRunnable t1、t2、t3を2つのスレッドで実行し、2種のアルファベッド(a、b)が混ざり、cが混ざることなく出力されるようにしてください。
なお、コンパイルコマンドについて理解できれいれば、以下のコマンドをコピーして利用してください。
javac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
また、実行コマンドについて理解できていれば、以下の実行コマンドをコピーして利用してください。
java -p classes --module jp.paiza.thread/jp.paiza.thread.TEST
期待する出力値
b0
a0
b1
a1
b2
a2
b3
a3
b4
a4
c0
c1
c2
c3
c4
演習課題「newCachedThreadPoolを使ってみよう」
ExecutorServiceインターフェースのnewCachedThreadPoolを使用してRunnable t1、t2、t3を3つのスレッドで実行し、各アルファベッド(a、b、c)全てが混ざって出力されるようにしてください。
なお、コンパイルコマンドについて理解できれいれば、以下のコマンドをコピーして利用してください。
javac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
また、実行コマンドについて理解できていれば、以下の実行コマンドをコピーして利用してください。
java -p classes --module jp.paiza.thread/jp.paiza.thread.TEST
期待する出力値
a0
b0
a1
c0
b1
a2
c1
a3
b2
c2
a4
b3
c3
b4
c4
#03:Executorフレームワーク2(ExecutorService)
このチャプターでは、ExecutorフレームワークにおけるExecutorServiceついて学習します。
ブラウザを開くだけでエディタ、Webサーバ、DB等の開発環境が整うクラウド開発環境PaizaCloudクラウドIDE。
PaizaCloud
https://paiza.cloud/ja/
シェルコマンド入門編
https://paiza.jp/works/shellcommand/primer
Linux入門編
https://paiza.jp/works/linux/primer
新・Linux入門編(LinuC対策版)
https://paiza.jp/works/linux/new-primer
新・Java入門編33: ストリームAPIについて学習しよう > 関数型インターフェース(Functional Interface)
https://paiza.jp/works/java/new-primer/java-new-primer-33/102000
新・Java入門編33: ストリームAPIについて学習しよう > ラムダ式
https://paiza.jp/works/java/new-primer/java-new-primer-33/102002
新・Java入門編34: モジュール・システムについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-34
インタフェースExecutorService
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/ExecutorService.html
クラスExecutors
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/Executors.html
インタフェースFuture
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/Future.html
インタフェースCallable
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/Callable.html
コンパイルコマンドjavac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
実行コマンドjava -p classes --module jp.paiza.thread/jp.paiza.thread.A
A.javapackage jp.paiza.thread;
import java.util.concurrent.*;
public class A {
public static void main(String... args) {
Runnable t1 = () -> {
for (var i = 0; i < 5; i++) {
System.out.println("+");
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
}
};
Runnable t2 = () -> {
for (var i = 0; i < 5; i++) {
System.out.println("*");
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
}
};
Callable<Boolean> t3 = () -> {
for (var i = 0; i < 5; i++) {
System.out.println("-");
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
}
return true;
};
var exe = Executors.newCachedThreadPool();
Future<?> f1 = exe.submit(t1);
Future<Boolean> f2 = exe.submit(t2, true);
Future<Boolean> f3 = exe.submit(t3);
try {
System.out.println("f1:" + f1.get());
System.out.println("f2:" + f2.get());
System.out.println("f3:" + f3.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
exe.shutdown();
}
}
}