每当我编写Thread.sleep(500);
代码时,它总是告诉我这有时会导致使用Thread.sleep();
. 是否有另一种方法可以在某些事情之前延迟时间。如果是这样,你能给我代码和解释吗?谢谢
3 回答
首先,您没有向我们展示任何代码,也没有提及“它”是什么。(如“它总是告诉我......”。)这使得一个具体的答案变得不可能。
最有可能提到的问题是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
如果您使用等待/通知,则使用是必不可少的。
如果你想在不久的将来发生一些事情,反复使用 sleep 是一件坏事。一次它不能保证“准时”,第二次它可以随时中断,导致你的程序出现故障。
如果你有一部分代码需要重复执行,使用Timer可以完美地解决这个问题。如果您有多个不同的代码部分需要在给定的延迟下执行,您应该使用ScheduledExecutorService。您可以直接使用 ScheduledThreadPoolExecutor,或者更方便地使用 ExecutorService。
您只需使用单个线程即可轻松规避线程问题。但是,如果您使用正确的工具,Java 中的线程并不是那么困难。
Condition
接口对于让其他线程通知您有关特定事件并要求当前线程“停放”到那时很有用。Condition
接口也有一个方法叫做waitUntil(Date deadline)
- 导致当前线程等到最后期限过去。
您是否在等待其他线程执行某些活动并等到那时?使用任何阻塞数据结构,如BlockingQueue
或其他高级同步器,如CountdownLatch
.
如果只是等待某个线程完成其执行,请使用join()
.
正如 Bay MadProgrammer 和 alfasin 所提到的,了解您想要实现的目标以及sleep()
您正在谈论的问题是很重要的。