为什么这个servlet在"每个连接线程中使用多个线程"政策?

时间:2016-03-02 18:39:37

标签: java multithreading servlets

前提:这个问题与previous longer one有关,我认为最好发布一个新的简短问题,而不是让另一个问题更长。我已经阅读了thisthisthisthis和其他许多人,但他们没有帮助。我的问题与其中任何一个都不重复,请不要投票结束,如果不感兴趣,请不要回答。

我在servlet中有这个doGet()方法

protected void doGet(/*params*/)/*exceptions*/{

    System.out.print("Thread:"+Thread.currentThread().getName()+"    ");
    System.out.print("Session:"+request.getSession().getId()+"    ");
    System.out.println("start...");

    try {Thread.sleep(4000);} 
    catch (InterruptedException e) {}

    System.out.print("Thread:"+Thread.currentThread().getName()+"    ");
    System.out.print("Session:"+request.getSession().getId()+"    ");
    System.out.println("...end");

}

当我从同一个浏览器的3个选项卡(几乎)同时调用servlet时,这是我的输出

18:09:17,080 [...] Thread:default task-15    Session:_5axg3aG4vaOf-5qxWJ5TWYk    start...
18:09:21,081 [...] Thread:default task-15    Session:_5axg3aG4vaOf-5qxWJ5TWYk    ...end
18:09:21,088 [...] Thread:default task-16    Session:KYQf66vtc4ezaUD1vrGIMQje    start...
18:09:25,090 [...] Thread:default task-16    Session:KYQf66vtc4ezaUD1vrGIMQje    ...end
18:09:25,101 [...] Thread:default task-17    Session:wyViZoHMGL1Mb8f9BCXO8aJK    start...
18:09:29,102 [...] Thread:default task-17    Session:wyViZoHMGL1Mb8f9BCXO8aJK    ...end

我的理解是3个请求是按顺序处理的,因为客户端对多个请求使用相同的连接,并且服务器使用每个连接的线程策略。

但似乎每次都使用不同的线程(15,16和17)。为什么会这样?我错了什么? (Wildfly 8 + Chrome)

1 个答案:

答案 0 :(得分:1)

Chrome会为每个标签创建一个新流程。它将从每个选项卡到servlet创建一个新的TCP连接。您可以通过在servlet代码中打印客户端端口来验证这一点。

由于您有3个TCP连接,并且带有每个连接的线程策略的wildfly,您正在目睹预期的结果。每个连接一个线程:)