Java Async在play 2.1中不起作用
我一直想测试异步方法。我只是不明白——对于调用的每个异步,是分配给它的新线程,还是它们进入一个线程中的队列 所以我想测试一下,但得到了奇怪的结果。 代码: 我认为,如果调用asyncFreeze,这将永远不会阻止处理http请求的线程。但它的性能与syncFreeze没有任何不同。对于这两种方法,一旦调用了八次,就无法加载其他页面,这表明所有为请求提供服务的线程都已被阻止。但这对我来说没有意义——这应该是异步方法的全部要点。它应该允许主线程继续处理请求。大家都在谈论 我做错了什么 非常感谢 建议编辑-我如何测试它:Java Async在play 2.1中不起作用,java,multithreading,http,asynchronous,playframework,Java,Multithreading,Http,Asynchronous,Playframework,我一直想测试异步方法。我只是不明白——对于调用的每个异步,是分配给它的新线程,还是它们进入一个线程中的队列 所以我想测试一下,但得到了奇怪的结果。 代码: 我认为,如果调用asyncFreeze,这将永远不会阻止处理http请求的线程。但它的性能与syncFreeze没有任何不同。对于这两种方法,一旦调用了八次,就无法加载其他页面,这表明所有为请求提供服务的线程都已被阻止。但这对我来说没有意义——这应该是异步方法的全部要点。它应该允许主线程继续处理请求。大家都在谈论 我做错了什么 非常感谢 建议
我只是重新加载了指向sync和async方法的浏览器。对于每个调用,该方法都会锁定,直到来自终端-。一开始我没有打开它。我只是在另一个浏览器窗口中尝试加载索引页时,继续重新加载对sync或async的调用。实际上,在对sync/async进行了八次调用之后,所有线程都被阻塞,索引不会加载,直到我在终端窗口上按enter键取消阻塞线程。这应该解释了您想知道的所有事情:
简而言之,它不是每个请求一个线程的模型。Play使用Akka,这是一种反应式编程原则的实现。过于简单-存在一个或多个线程池,一旦该池中的所有线程都处于繁忙状态,则不会执行其他任何操作。如果你有一个阻塞代码,那么有一些方法可以在文章中解释。你能提供你如何测试它吗?@arbuzz谢谢你的建议-请参阅编辑到问题。谢谢-但我仍然有问题-一些示例是在Scala中,我不是很有信心-我主要在模板中使用它。我仍然不知道如何处理阻塞请求。如何将请求发送到另一个线程/甚至线程池,并在完成后提取结果?在默认线程池中不阻塞请求处理程序?你能发布一段代码片段吗?非常感谢你的帮助。我很抱歉这么说,但要理解这些东西,你必须学习一点。不要考虑线程。有演员。试着读一下:Rado Buransky,无论如何,谢谢你——这是我最接近解决/理解多线程游戏的一次。我会好好研究这件事,希望能解决问题。我可能会在路上遇到一些绊脚石,所以如果你不介意的话,我会按照你的方式提出一些问题?当然,但我不觉得自己像个大师。
// block request and current thread
public static Result syncFreeze() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String a = null;
try {
System.out.println("sync freeze " + Thread.activeCount()
+ " threads running with active thread name "
+ Thread.currentThread().getName());
a = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return ok(a);
}
// block request but should keep thread open
public static Result asyncFreeze() {
Promise<String> promiseOfString = play.libs.Akka.future(new Reader());
return async(promiseOfString.map(new Function<String, Result>() {
public Result apply(String s) {
return ok(s);
}
}));
}
static class Reader implements Callable<String> {
public String call() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String a = null;
System.out.println("Async freeze " + Thread.activeCount()
+ " threads running with active thread name "
+ Thread.currentThread().getName());
try {
a = reader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return a;
}
}