我需要创建一个库,在其中我将有同步和异步方法.
executeSynchronous() - 等到我有结果,返回结果.executeAsynchronous() - 立即返回Future,如果需要,可在其他事情完成后处理.我的图书馆的核心逻辑
客户将使用我们的库,他们将通过传递DataKey构建器对象来调用它.然后我们将使用该DataKey对象构造一个URL,并通过执行它来对该URL进行HTTP客户端调用,然后在我们将响应作为JSON字符串返回之后,我们将通过创建DataResponse对象将该JSON字符串发送回我们的客户.有些客户会打电话executeSynchronous(),有些人可能会打电话executeAsynchronous(),这就是为什么我需要在我的库中单独提供两种方法.
接口:
public interface Client {
// for synchronous
public DataResponse executeSynchronous(DataKey key);
// for asynchronous
public Future<DataResponse> executeAsynchronous(DataKey key);
}
Run Code Online (Sandbox Code Playgroud)
然后我有我DataClient实现上面的Client接口:
public class DataClient implements Client {
private RestTemplate restTemplate = new RestTemplate();
// do I need to have all threads as non-daemon or I can have daemon thread for my use case?
private ExecutorService executor = …Run Code Online (Sandbox Code Playgroud) 应该是一个简单的问题.我正在使用Akka 2.4.2(包含Akka Streams和HTTP).我希望这个Source完成&程序终止,因为它Source是有限的,但它永远不会.为什么这个程序不会终止?
import scala.concurrent._
import scala.collection.immutable._
import akka._
import akka.actor._
import akka.stream._
import akka.stream.scaladsl._
import akka.util._
object Test extends App {
implicit val system = ActorSystem("TestSystem")
implicit val materializer = ActorMaterializer()
val s = Source.single(1)
s.runForeach(println)
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ sbt run
...
[info] Running Test
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] logger log1-Logging$DefaultLogger started
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] Default Loggers started
1
Run Code Online (Sandbox Code Playgroud)
我build.sbt文件的相关部分:
scalaVersion := "2.11.7"
scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")
libraryDependencies …Run Code Online (Sandbox Code Playgroud) 最近我被问到一个问题:
我们有了
setPriority()设置低优先级线程的方法.那为什么我们需要一个守护程序线程.他们之间有什么区别?
将线程标记为守护进程是否会更改其调度?