Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Async在play 2.1中不起作用_Java_Multithreading_Http_Asynchronous_Playframework - Fatal编程技术网

Java Async在play 2.1中不起作用

Java Async在play 2.1中不起作用,java,multithreading,http,asynchronous,playframework,Java,Multithreading,Http,Asynchronous,Playframework,我一直想测试异步方法。我只是不明白——对于调用的每个异步,是分配给它的新线程,还是它们进入一个线程中的队列 所以我想测试一下,但得到了奇怪的结果。 代码: 我认为,如果调用asyncFreeze,这将永远不会阻止处理http请求的线程。但它的性能与syncFreeze没有任何不同。对于这两种方法,一旦调用了八次,就无法加载其他页面,这表明所有为请求提供服务的线程都已被阻止。但这对我来说没有意义——这应该是异步方法的全部要点。它应该允许主线程继续处理请求。大家都在谈论 我做错了什么 非常感谢 建议

我一直想测试异步方法。我只是不明白——对于调用的每个异步,是分配给它的新线程,还是它们进入一个线程中的队列

所以我想测试一下,但得到了奇怪的结果。 代码:

我认为,如果调用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;
        }
    }