在action中调用Thread.sleep方法,多个请求为什么会串行执行?

action代码如下:

public void sleep() throws InterruptedException {
    Thread.sleep(5000);
    success("Awake @" + System.currentTimeMillis());
}

在浏览器中发送多个请求:/sleep

各个请求均顺序完成,输出的时间依次+5s。

Sleep语句改为

Db.find("SELECT SLEEP(5)");

通过数据库实现也是如此。

检查Undertow的ioThreads和workerThreads均不为1,通过IDEA运行,debug模式为false,拦截器都停用了。

请问是什么原因呢?

评论区

JFinal

2020-07-14 22:33

只有当前线程会 sleep,多线程并不会串行执行,原因应该是你调试方法不当

如果你用的是 eclipse ,在 sleep 代码处设置一个断点,在个请求到达你上面那个 sleep 代码以后,在 debug 小窗中会出现多个被挂起的线程,点击不同的挂起线程,可以在 sleep 以后继续调试

这个问题必然是与 jfinal 毫无关系的, jfinal 自然是无法干预让 Thread.sleep(...) 在多线程下串行的, 就是想干预也办不到

xiaoyi_e

2020-07-15 11:59

@JFinal 目前排查下来,疑为浏览器页面加载问题,此前通过浏览器(Chrome)多个标签页访问,确为按顺序收到,且Debug时,第一个请求Sleep完成,其它请求都未收到(线程池中相关线程都没有初始化)。执行第二个请求时,第一个线程处于waiting状态,后续请求也没有进入。
改为通过程序多线程请求,可达到预期,多个action并行执行。

JFinal

2020-07-15 17:30

热门反馈

扫码入社