我正在做一个小型测试项目,以检查异步编程在Java中的实际工作方式。
我试图在控制台上显示结果,但在控制台上什么也不显示。也许主线程将被执行并立即关闭。您能给我一个更好的方法在控制台上显示消息吗?
class Task5
{
public String task1()
{
return "Hello Benz";
}
public String task2(String msg)
{
return msg+" How are you?";
}
public String task3(String msg)
{
return msg+" Not Bad, How are you Jhon?";
}
}
class Task4 implements Runnable
{
private String msg;
public Task4(String msg)
{
this.msg=msg;
Thread th1=new Thread(this);
th1.start();
}
@Override
public void run() {
consumer.accept(msg);
}
Consumer<String> consumer=new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
}
public class AsyncProgram2 {
public void start()
{
for(int i=1;i<=1000;i++) {
CompletableFuture.supplyAsync(() -> new Task5().task1())
.thenApply(name -> new Task5().task2(name))
.thenApply(res1 -> new Task5().task3(res1))
.thenAccept(res3 -> new Task4(res3));
}
}
}
也要知道:随着我对所有这些反应性内容的了解,是否可以采用一种更好的方法来跟踪程序而不会阻塞?
答案 0 :(得分:0)
谢谢@Emiter的时间。但这对我不起作用。无论如何,我已经通过使用newCachedThreadPool()
方法或newFixedThreadPool(nThreads)
方法创建单独的线程池获得了解决方案。
该代码在我自己的线程池中运行,没有使用默认的ForkJoinPool,并且可以正常工作。
public void start()
{
ExecutorService myThreadPool= Executors.newCachedThreadPool();
CompletableFuture.supplyAsync(() -> new Task5().task1(),myThreadPool)
.thenApplyAsync(name -> new Task5().task2(name),myThreadPool)
.thenApplyAsync(res1 -> new Task5().task3(res1),myThreadPool)
.thenAcceptAsync(res2->new Task4(res2),myThreadPool);
}