2016-12-17 2 views
0

Я создал исполнителя WorkerExecutor и попробовал выполнить 2 долговременных фрагмента кода. Мой код:Код блокировки выполнен в одном потоке

public class BVerticle extends AbstractVerticle { 
    @Override 
    public void start() throws Exception { 
     WorkerExecutor executor = vertx.createSharedWorkerExecutor("worker", 10, 10000); 
     executor.executeBlocking(future -> { 
      out.printf("start 1, %s \n", Thread.currentThread().getName()); 
      try { 
       Thread.sleep(5_000L); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      future.complete(); 
     }, result -> { 
      out.printf("finish 2, %s \n", Thread.currentThread().getName()); 
     }); 
     executor.executeBlocking(future -> { 
      out.printf("start 2, %s \n", Thread.currentThread().getName()); 
      try { 
       Thread.sleep(5_000L); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      future.complete(); 
     }, result -> { 
      out.printf("finish 2, %s \n", Thread.currentThread().getName()); 
     }); 
    } 
} 

Выход после выполнения:

start 1, worker-0 
start 2, worker-0 
finish 2, vert.x-eventloop-thread-1 
finish 2, vert.x-eventloop-thread-1 

Почему блокирующий код выполняется только в одном потоке, следовательно?

ответ

1

Я нашел ответ в документации, мне нужно выполнить:

executeBlocking(Handler<Future<T>> blockingCodeHandler, boolean ordered, Handler<AsyncResult<T>> resultHandler) 

с упорядоченной = ложью, иначе мой код будет работать последовательно, а не параллельно в том же контексте

Смежные вопросы