执行顺序和Thread.sleep

时间:2014-11-29 21:21:47

标签: java multithreading

最近我看到一些代码依赖于不同线程中的执行顺序,这是通过使用某些值调用Thread.sleep来实现的。它没有任何问题,但我确信在某些罕见的情况下它不会。我写了一些代码,其中输出顺序取决于Thread.sleep的精确程度。

public class Test {
    public static Thread createDelayedPrintThread(final String text,
            final long delay) {
        return new Thread() {
            public void run() {
                try {
                    Thread.sleep(delay);
                    System.out.print(text);
                } catch (InterruptedException e) {
                }
            }
        };
    }

    public static void main(String[] args) {
        Thread t1 = createDelayedPrintThread("t1", 10);
        Thread t2 = createDelayedPrintThread("t2", 10);
        t1.start();
        t2.start();
    }
}

此代码不经意地可以输出展位t1t2t2t1,因此我将延迟视为不同:

Thread t1 = createDelayedPrintThread("t1", 10);
Thread t2 = createDelayedPrintThread("t2", 20);

现在输出t1t2但我有时会得到t2t1。当我进行一些CPU / IO密集型操作时,通常会发生这种情况 如果我将延迟更改为非常大的值

Thread t1 = createDelayedPrintThread("t1", 1_000); // one second
Thread t2 = createDelayedPrintThread("t2", 60_000); // one minute

是否可以保证应用程序将输出t1t2

2 个答案:

答案 0 :(得分:3)

Thread.sleep不是保证。 Java教程,关于Thread.sleep():

“然而,这些睡眠时间并不能保证精确,因为它们受到底层操作系统提供的设施的限制。此外,睡眠时间可以通过中断终止,我们将在后面的部分中看到。在任何情况下,您都不能假设调用sleep会在指定的时间段内暂停该线程。“

因此,您需要添加其他多线程逻辑以保证执行顺序。

答案 1 :(得分:3)

首先,你的理解是正确的;没有Thread.sleep()的数量(顺便说一句,因为Java 5你真的应该使用TimeUnit而不是TimeUnit.SECONDS.sleep(2L))将保证按顺序执行;你不能保证操作系统何时会安排这个或那个线程。

  

是否有任何保证应用程序将输出t1t2?

例如,这两个线程共享的一个易失性布尔变量就可以了(虽然你需要忙等待,所以这并不理想)。另一个例子是Semaphore

解决方案很多,您最终将完全取决于您的要求。

相关问题