這看起來像我打破了我的想法。我已經在Java 9上用Tomcat 9(與8相同)創建了一個新項目(同樣是8)。它只有一個servlet的Tomcat執行服務同步
@WebServlet(urlPatterns = "/*")
public class Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(new Date().getTime() /1000 + " " + Thread.currentThread().getName() + " Start");
/*long i = 0;
while (i < 3000000000L) {
if (i % 2 == 0) {
i++;
} else {
i++;
}
}*/
try {
Thread.sleep(2000);
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println(new Date().getTime()/1000 + " " + Thread.currentThread().getName() + " Done");
}
}
我所有的經驗,說我對這種方法以異步方式工作,但我所說的,通過3個標籤的servlet在我的瀏覽器(同時爲可能的),我看到這樣的畫面在我的日誌:
1492723549 http-nio-9999-exec-2 Start
1492723551 http-nio-9999-exec-2 Done
1492723551 http-nio-9999-exec-1 Start
1492723553 http-nio-9999-exec-1 Done
1492723553 http-nio-9999-exec-3 Start
1492723555 http-nio-9999-exec-3 Done
可以看出,每個請求都會鎖定方法,直到它完成。有人能告訴我爲什麼嗎?我真的期望3個同時開始和2秒後3個完成。
謝謝!
爲什麼你有一個'Thread.sleep(2000);'?你正在使用非阻塞的io,而你正在阻止。 –
我想阻止一個線程來模擬一些辛苦的工作。池中的其他線程是免費的。不是嗎? –
不要阻止做「努力工作」。使用['CompletableFuture'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html)。對於[示例](https://www.ibm.com/developerworks/library/j-jvmc3/)。 –