我们不会在 completableFuture 中传递 runnable 或 callable。它采用供应商类型,这是一个功能接口。只需创建普通方法并将它们与执行器对象一起传递。参考下面的例子。
package completableFuture;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CompFuture {
ExecutorService firstExecService = Executors.newFixedThreadPool(5);
public static void main(String[] args) {
CompFuture compFuture = new CompFuture();
compFuture.testMe("Java");
}
public String m1(String param) {
Random r = new Random();
int val = r.nextInt(20) * 1000;
System.out.println(Thread.currentThread().getName() + " " + val);
try {
Thread.sleep(val);
} catch (InterruptedException e) {
e.printStackTrace();
}
return param + " Hello my";
}
public void m2(String salutation) {
System.out.println(Thread.currentThread().getName() + " ##" + salutation + " Friend!");
}
public void testMe(String start) {
System.out.println("TM: " + Thread.currentThread());
for (int i = 0; i < 5; i++) {
CompletableFuture.supplyAsync(() -> m1(start), firstExecService).thenAccept(s -> m2(s));
}
}
}
上述程序的输出:: 执行时间最短的线程首先给出它的输出。
TM:线程[主,5,主]
池 1 线程 1 1000
池 1 线程 2 14000
池 1 线程 4 3000
池 1 线程 3 0
池 1 线程 5 9000
pool-1-thread-3 ##Java 你好,我的朋友!
pool-1-thread-1 ##Java 你好,我的朋友!
pool-1-thread-4 ##Java 你好,我的朋友!
pool-1-thread-5 ##Java 你好,我的朋友!
pool-1-thread-2 ##Java 你好,我的朋友!