Java 列表扩展的增量未来
我基本上有一个Java 列表扩展的增量未来,java,concurrency,future,Java,Concurrency,Future,我基本上有一个未来,它是从服务器批量获取的。对于一些客户,我希望在未来完成时,在加载整个集合的同时提供增量结果 是否有一个共同的未来扩展定义的地方?这些期货的典型模式/组合是什么 我假设给定的IncrementalListFuture我可以轻松定义map操作。你还想到了什么 是否有一个共同的未来扩展定义的地方 我假设您谈论的是来自ExecutorService的增量结果。你应该考虑使用一个允许你在“未来< /Cord>”对象中得到通知的对象。< /P> 引用javadocs: Completio
未来
,它是从服务器批量获取的。对于一些客户,我希望在未来完成时,在加载整个集合的同时提供增量结果
是否有一个共同的未来扩展定义的地方?这些期货的典型模式/组合是什么
我假设给定的IncrementalListFuture
我可以轻松定义map
操作。你还想到了什么
是否有一个共同的未来扩展定义的地方
我假设您谈论的是来自ExecutorService
的增量结果。你应该考虑使用一个允许你在“<代码>未来< /Cord>”对象中得到通知的对象。< /P>
引用javadocs:
CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
for (Callable<Result> s : solvers) {
ecs.submit(s);
}
int n = solvers.size();
for (int i = 0; i < n; ++i) {
// this waits for one of the futures to finish and provide a result
Future<Result> future = ecs.take();
Result result = future.get();
if (result != null) {
// do something with the result
}
}
您还可以使用某种类型的SomeJob.take()
方法,该方法调用在job类中定义的BlockingQueue
// the blocking queue in this case is hidden inside your job object
T result = someJob.take();
...
是否有一个共同的未来扩展定义的地方
我假设您谈论的是来自ExecutorService
的增量结果。你应该考虑使用一个允许你在“<代码>未来< /Cord>”对象中得到通知的对象。< /P>
引用javadocs:
CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
for (Callable<Result> s : solvers) {
ecs.submit(s);
}
int n = solvers.size();
for (int i = 0; i < n; ++i) {
// this waits for one of the futures to finish and provide a result
Future<Result> future = ecs.take();
Result result = future.get();
if (result != null) {
// do something with the result
}
}
您还可以使用某种类型的SomeJob.take()
方法,该方法调用在job类中定义的BlockingQueue
// the blocking queue in this case is hidden inside your job object
T result = someJob.take();
...
下面是我要做的:
Collections.synchronizedList
集合包装。不可修改列表
或者,正如格雷所建议的,
BlockingQueue
s非常适合这样的线程协调。但是,这可能需要对客户端代码进行更多更改。以下是我要做的:
Collections.synchronizedList
集合包装。不可修改列表
或者,正如格雷所建议的,
BlockingQueue
s非常适合这样的线程协调。但是,这可能需要对客户端代码进行更多更改。Future实际上是为了返回单个(原子)结果而设计的,而不是为了以这种方式传递中间结果。您真正想要做的是使用多个期货,每批一个
我们有一个类似的需求,我们需要从不同的远程服务器获取大量的东西,并且每个东西都会在不同的时间返回。我们不想等到最后一个返回,而是按照返回的顺序处理它们。为此,我们创建了,它接受一个Iterable
,并返回一个Iterable
,在迭代时阻塞,完全抽象了未来
接口的用法
如果您了解该类是如何实现的,您将了解如何使用CompletionService
从Executor
接收结果(如果您需要自己构建该类),并按照它们的可用顺序进行
编辑:刚刚看到Gray的回答的后半部分是类似的,基本上使用ExecutorCompletionService,Future的设计目的是返回单个(原子)结果,而不是以这种方式传递中间结果。您真正想要做的是使用多个期货,每批一个 我们有一个类似的需求,我们需要从不同的远程服务器获取大量的东西,并且每个东西都会在不同的时间返回。我们不想等到最后一个返回,而是按照返回的顺序处理它们。为此,我们创建了,它接受一个
Iterable
,并返回一个Iterable
,在迭代时阻塞,完全抽象了未来
接口的用法
如果您了解该类是如何实现的,您将了解如何使用CompletionService
从Executor
接收结果(如果您需要自己构建该类),并按照它们的可用顺序进行
编辑:刚刚看到格雷的下半部分答案是类似的,基本上是使用ExecutorCompletionService来回答我自己的问题:最近这方面有了很多发展。其中最常用的是:Play iteratees()和Rx for.NET() 他们定义的不是未来,而是:
interface Observable<T> {
Disposable subscribe(Observer<T> observer);
}
interface Observer<T> {
void onCompleted();
void onError(Exception error);
void onNext(T value);
}
可观察的接口{
(观察员);
}
界面观察者{
无效未完成();
无效错误(异常错误);
void onNext(T值);
}
还有很多组合器。回答我自己的问题:最近在这个领域有了很多发展。其中最常用的是:Play iteratees()和Rx for.NET() 他们定义的不是未来,而是:
interface Observable<T> {
Disposable subscribe(Observer<T> observer);
}
interface Observer<T> {
void onCompleted();
void onError(Exception error);
void onNext(T value);
}
可观察的接口{
(观察员);
}
界面观察者{
无效未完成();
无效错误(异常错误);
void onNext(T值);
}
还有很多组合词。除了可观察的,你还可以看看twitter的方法 它们使用,这是的异步版本 基本上,这是一个简单的特征,类似于
列表
trait Spool[+A] {
def head: A
/**
* The (deferred) tail of the spool. Invalid for empty spools.
*/
def tail: Future[Spool[A]]
}