以异步方式执行代码

时间:2020-08-26 05:00:51

标签: java asynchronous reactive-programming

我正在做一个小型测试项目,以检查异步编程在Java中的实际工作方式。

我试图在控制台上显示结果,但在控制台上什么也不显示。也许主线程将被执行并立即关闭。您能给我一个更好的方法在控制台上显示消息吗?

Task5类

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?";
    }
}

Task4类

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);
        }
    };

}

AsyncProgram类

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));
      }
    }
}

也要知道:随着我对所有这些反应性内容的了解,是否可以采用一种更好的方法来跟踪程序而不会阻塞?

1 个答案:

答案 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);

    }