0

每当我编写Thread.sleep(500);代码时,它总是告诉我这有时会导致使用Thread.sleep();. 是否有另一种方法可以在某些事情之前延迟时间。如果是这样,你能给我代码和解释吗?谢谢

4

3 回答 3

2

首先,您没有向我们展示任何代码,也没有提及“它”是什么。(如“它总是告诉我......”。)这使得一个具体的答案变得不可能。


最有可能提到的问题是sleep使您的代码浪费或反应迟钝。用于使线程等待某些条件的常见“hack”是重复调用 sleep 然后测试条件。问题是,如果在您睡眠时条件为真,则线程仍将被挂起,直到睡眠间隔到期。如果您使睡眠间隔更小,那么您会通过唤醒/测试/睡眠迭代“消耗”更多的 CPU 周期。

如果您尝试实现“等待某个条件变为真”,那么有效的方法是使用wait()and notify()(or notifyAll()) 或适当的更高级别的同步类。

经典的 Java 模式是这样的:

    // waiting for the condition
    synchronized (obj) {
        while (!condition) {
            obj.wait();
        }
    }

    ...

    // updating the condition ...
    synchronized (obj) {
        // do something that makes condition true
        obj.wait();
    }

请注意,synchronized如果您使用等待/通知,则使用是必不可少的。

于 2013-10-06T05:14:27.033 回答
0

如果你想在不久的将来发生一些事情,反复使用 sleep 是一件坏事。一次它不能保证“准时”,第二次它可以随时中断,导致你的程序出现故障。

如果你有一部分代码需要重复执行,使用Timer可以完美地解决这个问题。如果您有多个不同的代码部分需要在给定的延迟下执行,您应该使用ScheduledExecutorService。您可以直接使用 ScheduledThreadPoolExecutor,或者更方便地使用 ExecutorService。

您只需使用单个线程即可轻松规避线程问题。但是,如果您使用正确的工具,Java 中的线程并不是那么困难。

于 2013-10-06T20:48:24.617 回答
0

Condition接口对于让其他线程通知您有关特定事件并要求当前线程“停放”到那时很有用。Condition接口也有一个方法叫做waitUntil(Date deadline)- 导致当前线程等到最后期限过去。

您是否在等待其他线程执行某些活动并等到那时?使用任何阻塞数据结构,如BlockingQueue或其他高级同步器,如CountdownLatch.

如果只是等待某个线程完成其执行,请使用join().

正如 Bay MadProgrammer 和 alfasin 所提到的,了解您想要实现的目标以及sleep()您正在谈论的问题是很重要的。

于 2013-10-06T04:49:58.293 回答