阅读Java-8规范,我不断看到对"SAM类型"的引用.我无法找到明确解释这是什么.
什么是SAM类型以及什么是何时可以使用的示例场景?
什么是在Scala中延迟函数执行的最简单方法,比如JavaScript setTimeout?理想情况下,每次延迟执行都不会产生线程,即顺序执行.我能找到的最接近的是Akka的Scheduler,但这太过分了.
为了我的测试目的,我打开了数千个连接,然后他们在10秒钟内获得响应.在node.js中,它看起来像:
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
setTimeout(function() {res.end('Hello World\n');}, 10000 );
}).listen(8080, '127.0.0.1');
Run Code Online (Sandbox Code Playgroud)
但是最接近的Scala版本会做同样的事情吗?我不在乎res.end是在多个线程中执行还是在一个线程中排队.
我有一些启动“缓慢”进程的代码,我将其包装在 Future 中。如果出现问题,我想慢慢循环并在暂停后重试——无限期地。有点像这样:(我知道最终会有人介入并解决问题)
def doSomething():Unit = {
aFutureThing().onComplete {
case Success(s) => println("Success: "+s)
case Failure(x) =>
// Take some (hopefully) corrective action here, call for help, etc.
Thread.sleep(1000) // pause a bit
doSomething() // and try again...
}
}
doit()
Run Code Online (Sandbox Code Playgroud)
当调用 onComplete 回调时, doSomething() 是否仍在堆栈中,或者是否因为我们在 Future 执行慢速任务 (aFutureThing) 时返回而被弹出?doSomething 的递归调用(最终)会破坏堆栈/OutOfMemory 或其他东西吗?如果是这样......是否有更安全的方法来重试 Future?