在Java中构建完整未来的最佳方法是什么?我已经CompletedFuture在下面实现了自己,但希望这样的东西已经存在.
public class CompletedFuture<T> implements Future<T> {
private final T result;
public CompletedFuture(final T result) {
this.result = result;
}
@Override
public boolean cancel(final boolean b) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public T get() throws InterruptedException, ExecutionException {
return this.result;
}
@Override
public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
return get();
}
}
Run Code Online (Sandbox Code Playgroud) 假设我从一些URL下载了一个(可能很大的)图像列表.我正在使用Scala,所以我要做的是:
import scala.actors.Futures._
// Retrieve URLs from somewhere
val urls: List[String] = ...
// Download image (blocking operation)
val fimages: List[Future[...]] = urls.map (url => future { download url })
// Do something (display) when complete
fimages.foreach (_.foreach (display _))
Run Code Online (Sandbox Code Playgroud)
我对Scala有点新意,所以对我来说这看起来仍然有些神奇:
display _)是否会在主线程上执行,如果没有,我该如何确定呢?谢谢你的建议!
是否有可能从今天开始禁用未来日期?
我们今天说是2010年10月23日,所以24/10/2010以后禁用.
对不起,我是jQuery和JavaScript的新手.
我正在尝试深入探索新C++ 11标准的所有选项,同时使用std :: async并阅读其定义,我注意到两件事,至少在linux下使用gcc 4.8.1:
pthread,如果你想使用std::async你需要pthread.在这一点上,我很自然地问为什么选择std :: async甚至是一组简单的仿函数?这是一个根本无法扩展的解决方案,您调用的未来越多,您的程序响应就越少.
我错过了什么吗?你能展示一个被授予以异步,非阻塞方式执行的例子吗?
我正在阅读斯卡拉食谱(http://shop.oreilly.com/product/0636920026914.do)
有一个与未来使用相关的例子涉及到理解.
到目前为止,我对理解的理解是,当与集合一起使用时,它将产生具有相同类型的另一个集合.例如,如果每个 futureX都是类型Future[Int],则以下也应该是类型Future[Int]:
for {
r1 <- future1
r2 <- future2
r3 <- future3
} yield (r1+r2+r3)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下<-在这段代码中使用时究竟发生了什么吗?我知道如果它是一个生成器,它将通过循环获取每个元素.
在Scala中有一个Promise类,可用于手动完成Future.我正在寻找C#的替代品.
我正在编写测试,我希望它看起来与此类似:
// var MyResult has a field `Header`
var promise = new Promise<MyResult>;
handlerMyEventsWithHandler( msg =>
promise.Complete(msg);
);
// Wait for 2 seconds
var myResult = promise.Future.Await(2000);
Assert.Equals("my header", myResult.Header);
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是C#的正确模式,但我无法找到一种合理的方法来实现同样的东西,即使是有些不同的模式.
编辑:请注意,这async//await没有帮助,因为我没有任务等待!我只能访问将在另一个线程上运行的处理程序.
在我的真实程序中引入std :: async的嵌套调用后遇到崩溃后,我能够在下面的最小示例中重现该问题.它经常崩溃,但并非总是如此.你看到出了什么问题,还是编译器或标准库bug?请注意,如果get()添加对期货的调用,问题仍然存在.
#include <future>
#include <vector>
int main (int, char *[])
{
std::vector<std::future<void>> v;
v.reserve(100);
for (int i = 0; i != 100; ++i)
{
v.emplace_back(std::async(std::launch::async, [] () {
std::async(std::launch::async, [] { });
}));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我观察到两种不同的崩溃:(约每五次运行)
环境:
g++ -std=c++11 -pthread futures.cpp选项-pthread?
可能是因为某种原因在我的环境中,这个选项-pthread没有被考虑在内吗?无论有没有这个选项,我都会观察到相同的行为.
当使用ExecutorService和Future对象(提交Runnable任务时)时,如果我为未来的get函数指定了超时值,那么在TimeoutException抛出a时底层线程是否会被杀死?
Java Future有一个cancel方法,它可以中断运行Future任务的线程.例如,如果我将一个可中断的阻塞调用包装在一个Java Future我可以稍后中断它.
Scala Future没有提供任何cancel方法.假设我在一个中包含一个可中断的阻塞调用Scala Future.我怎么能打断它?
我想写一个返回a的异步方法CompletableFuture.未来的唯一目的是跟踪方法何时完成,而不是结果.返回CompletableFuture<Void>还是更好CompletableFuture<?>?有理由偏爱其中一个,还是可以互换?
CompletableFuture本身CompletableFuture<Void>从它的许多方法返回.java.nio有一个Future<Void>在AsynchronousSocketChannel:Future<Void> connect(SocketAddress remote).java.util.concurrent类ExecutorService和ScheduledExecutorService返回Future<?>:例如,with Future<?> submit(Runnable task).请注意,我只询问返回类型,而不是参数列表,变量声明或其他上下文.
future ×10
java ×3
scala ×3
c++ ×2
c++11 ×2
async-await ×1
asynchronous ×1
c# ×1
concurrency ×1
date ×1
disable-link ×1
gcc ×1
io ×1
jquery ×1
mingw-w64 ×1
promise ×1
return-type ×1
stdasync ×1
task ×1