Используйте CompletablFuture, чтобы получить разные результаты (асинхронизация и синхронизация) - PullRequest
0 голосов
/ 10 июля 2019
public static void main(String[] args) throws ExecutionException, InterruptedException {
    long start = System.currentTimeMillis();

    CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{
        System.out.println("first----"+Thread.currentThread().getName());   

         try {
            TimeUnit.SECONDS.sleep(2); //  comment the code 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello";
    }).thenApply(s->{
        System.out.println("second----"+Thread.currentThread().getName());
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return s+"World";
    }).thenApply(a->{
        System.out.println("third----"+Thread.currentThread().getName());
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return a.toUpperCase();
    });

    System.out.println("time:"+(System.currentTimeMillis()-start)/1000);
    System.out.println("result:"+future.get());
}

Прежде чем я не прокомментировал этот код, я запускаю результат следующим образом. enter image description here

Видно, что программа выполняется асинхронно, но после комментирования этого кода результат сильно изменился. Программа иногда асинхронная, иногда синхронизируется, и потоки используются каждым модулем применения. enter image description here

enter image description here enter image description here

Это будет иначе. В чем причина?

...