Thread.sleep没有睡眠当前线程

时间:2018-04-03 16:02:34

标签: java spring multithreading

为了暂停一个进程几秒钟,我在Runnable的run方法中添加了Thread.sleep。以下是代码。

@PostConstruct
public void initScheduler() {
    Runnable run = () -> {
        while (true) {
            try {
                long productId = PRODUCT_ID_QUEUE.take();
                //Thread.sleep(5L);
                Thread.currentThread().sleep(5L);
                try {
                    populateProductRatingsData(productId);
                } catch (Exception e) {
                    LOG.error("Error while executing populateProductRatingsData with productId = " + productId, e);
                }
            } catch (Exception e) {
                LOG.error("Error while queue#take for reviews", e);
            }
        }
    };
    Thread t = new Thread(run);
    t.start();
}

然而,暂停没有发生,然后我切换到Thread.currentThread().sleep(5L),这也是无效的。所以,为了延迟我终于使用了

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(() -> populateProductRatingsData(productId), 5, TimeUnit.SECONDS);

解决了这个问题。 那么,为什么Thread.sleep不起作用?或者错误在哪里?

由于

2 个答案:

答案 0 :(得分:3)

如果您使用过Thread.sleep(5L);,它只能睡5毫秒而不是秒。

所以尽管线程已经睡了,你可能还没有观察到睡眠。

答案 1 :(得分:1)

它可能实际上有效但Thread.sleep()的论点单位是毫秒,因为您可以查看javadoc of Thread