2011-09-16 19 views
2

我目前正在考虑使用Akka(Java API /库)来完成创建几个Future的任务并将它们放入BlockingQueue。现在可能是由Callables处理的一些任务在调用线程中运行得更快/更快,而不是创建新线程或等待新线程变为可用。我认为阿卡是做正是这一点,例如,如果我运行:Akka/futures - Akka是否使用当前线程或调度程序来决定它是否“值钱”?

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

它可能会在当前线程调用其未来的(可赎回)执行的还是我错了?也许我错了,因为我不知道调度员会如何决定是否创建了一个新的线程。

现在我只是使用一个使用其他线程的ExecutorService,但由于某些任务真的很快,所以它们也可以由当前线程来处理。但我使用的是BlockingQueue<Future<Float>>,这就是为什么我有时不能使用Future而有时不使用Future

最好的问候,
约翰内斯

回答

2

如果没有指定一个它总是使用一个线程从所提供的调度员,或全局默认。要使用相同的线程,您需要传入一个CallingThreadDispatcher,但它会始终同步。除了程序员之外,任何人都无法决定计算是否便宜。

+0

因此,我可以以某种方式在CallingThreadDispatcher和ehm之间动态地选择...另一个?我要遍历一个树结构并计算每个节点和其他一些事物的后代或自身数量。因此,我假设在前两个或三个层次上,并行地进行实际计算是值得的。但是在某些情况下(level> 2或者至少在叶节点上),如果我以某种方式创建在当前线程中执行的期货,那将会很好。由于我无法为“BlockingQueue”混合Future和non Futures,所以我处于一种“困境”。 – Johannes

+1

在Callable中进行计算,并使用DefaultCompletableFuture重新使用计算线程并自行完成它? –

+0

我找不到'DefaultCompletableFuture'的Java API/Javadoc参考,或者根本没有找到这个教程: - /你可能知道它是否可以在“纯”Java(1.7)中实现?我不认为有可能创建一个没有ExecutorService的Future,所以我可能不得不使用Akka,我也想查看它;-) – Johannes

相关问题