在Java中实现延时,可以通过多种方式进行,以下是一些常见的方法和示例:

使用Thread.sleep()
最简单的方式是使用Thread.sleep(long millis)方法,该方法可以使当前线程暂停执行指定的毫秒数。
示例代码:
public class DelayExample {
public static void main(String[] args) {
try {
System.out.println("程序开始执行。");
Thread.sleep(5000); // 暂停5秒
System.out.println("程序继续执行。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
使用ScheduledExecutorService
ScheduledExecutorService是Java并发包中的一个工具,可以用来安排在给定延迟后运行的任务。
示例代码:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorExample {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(() -> {
System.out.println("每5秒执行一次任务。");
}, 0, 5, TimeUnit.SECONDS);
}
}
使用CountDownLatch
CountDownLatch是一个同步辅助类,在完成一组操作之前允许当前线程等待。

示例代码:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(1);
new Thread(() -> {
try {
System.out.println("线程开始执行,等待信号。");
latch.await(); // 等待信号
System.out.println("信号到达,线程继续执行。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
try {
Thread.sleep(5000); // 主线程暂停5秒
latch.countDown(); // 发送信号
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
使用CyclicBarrier
CyclicBarrier是一个同步辅助类,在涉及固定大小的线程组时非常有用,这些线程必须等待彼此达到某个点(barrier)。
示例代码:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("所有线程已到达barrier,执行后续操作。");
});
new Thread(() -> {
try {
System.out.println("线程1开始执行,等待barrier。");
barrier.await();
System.out.println("线程1通过barrier。");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
System.out.println("线程2开始执行,等待barrier。");
barrier.await();
System.out.println("线程2通过barrier。");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
System.out.println("线程3开始执行,等待barrier。");
barrier.await();
System.out.println("线程3通过barrier。");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
使用DelayQueue
DelayQueue是一个线程安全的无界队列,它使用延迟优先队列(即元素必须延迟获取)。
示例代码:
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
class DelayedTask implements Delayed {
private final long trigger;
public DelayedTask(long trigger) {
this.trigger = trigger;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(trigger - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(trigger, ((DelayedTask) o).trigger);
}
}
public class DelayQueueExample {
public static void main(String[] args) {
DelayQueue<DelayedTask> queue = new DelayQueue<>();
queue.add(new DelayedTask(System.currentTimeMillis() + 5000));
try {
DelayedTask task = queue.take();
System.out.println("任务执行,延迟时间:" + task.getDelay(TimeUnit.MILLISECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
通过上述方法,您可以在Java中实现延时功能,根据具体的需求选择合适的方法。




















