Akka/futures решает ли Akka, стоит ли использовать текущий поток или диспетчер?

В настоящее время я думаю об использовании Akka (Java API/библиотеки) для выполнения задачи создания нескольких Future и помещения их в BlockingQueue. Теперь может случиться так, что некоторые задачи, которые обрабатываются Callables, быстрее/быстрее выполняются в вызывающем потоке вместо создания нового потока или ожидания доступности нового потока. Я думаю, что Akka делает именно это, например, если я бегу:

Future<String> f1 = future(new Callable<String>() {
                  public String call() {
                      return "Hello" + "World";
                  }
              });

Это может быть выполнено в текущем потоке, который вызывает future (Callable), или я ошибаюсь? Возможно, я ошибаюсь, потому что не понимаю, как диспетчер решит, будет ли создан новый поток или нет.

Прямо сейчас я просто использую ExecutorService, который использует другие потоки, но, поскольку некоторые задачи действительно очень быстрые, они также могут быть обработаны текущим потоком. Но я использую BlockingQueue<Future<Float>>, поэтому я иногда не могу использовать Future, а иногда нет.

С наилучшими пожеланиями,
Йоханнес


person Johannes    schedule 16.09.2011    source источник


Ответы (1)


Он всегда использует поток из предоставленного диспетчера или глобальное значение по умолчанию, если никто не указан. Чтобы использовать тот же поток, вам нужно передать CallingThreadDispatcher, но тогда он всегда будет синхронным. Никто, кроме программиста, никак не может решить, дешевы вычисления или нет.

person Viktor Klang    schedule 16.09.2011
comment
Итак, могу ли я как-то динамически выбирать между CallingThreadDispatcher и хм... другим? Я собираюсь пройтись по древовидной структуре и вычислить количество потомков или себя для каждого узла и некоторые другие вещи. Таким образом, я предполагаю, что на первых двух или трех уровнях стоит выполнять фактические вычисления параллельно. Но в некоторых случаях (уровень › 2 или, по крайней мере, на листовых узлах) было бы неплохо, если бы я каким-то образом мог создавать фьючерсы, которые выполняются в текущем потоке. Поскольку я не могу смешивать фьючерсы и не фьючерсы для BlockingQueue, я стою перед дилеммой. - person Johannes; 16.09.2011
comment
Выполнять свои вычисления внутри Callable, повторно использовать вычислительный поток с DefaultCompletableFuture и выполнять его самостоятельно? - person Viktor Klang; 16.09.2011
comment
Я не могу найти ссылку на Java API/Javadoc для DefaultCompletableFuture или вообще найти, только учебник :-/ Возможно, вы знаете, выполнимо ли это даже в чистой Java (1.7)? Я не думаю, что можно создать Future без ExecutorService, поэтому мне, возможно, придется использовать Akka, которую я все равно хотел проверить ;-) - person Johannes; 16.09.2011
comment
Прочтите ScalaDoc/код для DefaultCompletableFuture в Akka - person Viktor Klang; 16.09.2011