Java Выполнить задачу параллельно основному потоку, не блокируя ее - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь использовать функции Java 8 CompletableFuture, которые говорят, что дают возможность работать асинхронно.Но для того, чтобы выполнить «будущее», необходимо вызвать метод future.get().Это блокирует основной поток.так как он ждет 30 секунд сна перед выполнением строки после future.get()

Есть ли способ добиться этого?Выполните не блокирующим способом, которым я пытаюсь напечатать

«Я буду работать в главном потоке.»

до

«Я буду работать в отдельном потоке, чем основной поток.»

public static void main(String[] args) throws ExecutionException, InterruptedException {


    CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
        @Override
        public void run() {
            // Simulate a long-running Job
            try {
                TimeUnit.SECONDS.sleep(30);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            System.out.println("I'll run in a separate thread than the main thread.");
        }
    });
    future.get();
    System.out.println("I'll run in the main thread.");
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

То, что вы пытаетесь достичь, не будет таким тривиальным, если я правильно понял.У вас есть входящий вызов, и вы хотите обработать этот вызов без помех, и параллельно с этим потоком вы хотите запустить отдельный процесс, который не зависит от основного процесса.(Поправьте меня, если я неправильно понял)

Я бы решил это с помощью очереди.Вы в основном потоке публикуете что-то в очереди и выполняете то, что ему нужно для выполнения.Затем в очереди ожидают отдельные потребители, которые будут выполнять другой процесс, не влияя на основной поток.

0 голосов
/ 01 марта 2019

CompletableFuture.runAsync(Runnable) уже запускает работу вашего другого потока.Вызов future.get() - это просто способ дождаться завершения работы этого потока и получить его результат, прежде чем продолжить выполнение потока в потоке.

Когда вы запускаете поток и get немедленно, не делая ничего между (как вы делаете), то нет смысла запускать поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...