等待而不尝试捕获
Wait without try-catch
我正在开发一个永远运行的 Java 程序,但我不知道如何在不使用 'try catch' 的情况下将每个循环延迟一秒钟。我试过了
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) {
TimeUnit wait = new TimeUnit();
while (true) {
wait.SECONDS.sleep(1);
}
}
}
但似乎没有用。谁能帮帮我?
考虑了一段时间后,我同意 Thread.sleep 显然是在循环中停止主线程的直接方法。
但是,在其他可能不同的用例中,因为它暂停了一个可以同时做其他事情的线程。 Here you have a discussion of Timer vs Thread.sleep, if you're interested and here 另一个不太全面的问题答案,可能会重复。
public static void sleep(int someDelay) {
try {
Thread.sleep(someDelay);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
对于要求更高的场景ScheduledThreadPoolExecutor
是你的朋友
ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
executor.schedule(() -> {
// doSmthg
}, 12, TimeUnit.HOURS);
另一种方法是 Timer/Timertask,现在通常是 discouraged(感谢 @rkosegi 指出了这一点)以支持 ScheduledThreadPoolExecutor。池大小为 1 模仿 Timer/Timertask 功能。
另一方面,Timer/Timertask在单线程场景中对大量小任务有优势“实施说明:这class可扩展到大量并发scheduled tasks (thousands should present present no problem). 在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本是 O(log n),其中 n 是并发调度任务的数量。",其中 ScheduledExecutorService 使用 BlockingQueue。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// do smthg;
}
}, someDelay);
最直接的方法是创建一个方法。
public static void sleep(int delay) {
try {
TimeUnit.SECONDS.sleep(delay);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
现在只要你需要睡觉就调用这个方法。
for (int i = 0; i < 10; i++ ) {
System.out.println(i);
sleep(1); // 1 second
}
你可以用Thread.sleep(TIME_FOR_DELAY)
行延迟但是你必须把它放在try-catch
块里面
try{
//TODO before wait
Thread.sleep(TIME_FOR_DELAY);
//TODO after wait
}catch(InterruptedException e){
//
}
有人说我应该这样做
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) throws InterruptedException {
while (true) {
TimeUnit.SECONDS.sleep(1);
}
}
}
它奏效了。谢谢那个人
我正在开发一个永远运行的 Java 程序,但我不知道如何在不使用 'try catch' 的情况下将每个循环延迟一秒钟。我试过了
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) {
TimeUnit wait = new TimeUnit();
while (true) {
wait.SECONDS.sleep(1);
}
}
}
但似乎没有用。谁能帮帮我?
考虑了一段时间后,我同意 Thread.sleep 显然是在循环中停止主线程的直接方法。
但是,在其他可能不同的用例中,因为它暂停了一个可以同时做其他事情的线程。 Here you have a discussion of Timer vs Thread.sleep, if you're interested and here 另一个不太全面的问题答案,可能会重复。
public static void sleep(int someDelay) {
try {
Thread.sleep(someDelay);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
对于要求更高的场景ScheduledThreadPoolExecutor
是你的朋友
ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
executor.schedule(() -> {
// doSmthg
}, 12, TimeUnit.HOURS);
另一种方法是 Timer/Timertask,现在通常是 discouraged(感谢 @rkosegi 指出了这一点)以支持 ScheduledThreadPoolExecutor。池大小为 1 模仿 Timer/Timertask 功能。
另一方面,Timer/Timertask在单线程场景中对大量小任务有优势“实施说明:这class可扩展到大量并发scheduled tasks (thousands should present present no problem). 在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本是 O(log n),其中 n 是并发调度任务的数量。",其中 ScheduledExecutorService 使用 BlockingQueue。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// do smthg;
}
}, someDelay);
最直接的方法是创建一个方法。
public static void sleep(int delay) {
try {
TimeUnit.SECONDS.sleep(delay);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
现在只要你需要睡觉就调用这个方法。
for (int i = 0; i < 10; i++ ) {
System.out.println(i);
sleep(1); // 1 second
}
你可以用Thread.sleep(TIME_FOR_DELAY)
行延迟但是你必须把它放在try-catch
块里面
try{
//TODO before wait
Thread.sleep(TIME_FOR_DELAY);
//TODO after wait
}catch(InterruptedException e){
//
}
有人说我应该这样做
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) throws InterruptedException {
while (true) {
TimeUnit.SECONDS.sleep(1);
}
}
}
它奏效了。谢谢那个人