java 一次性定时器
时间: 2023-10-15 07:31:17 浏览: 153
Java中可以使用Timer类来创建一次性定时器。可以通过创建Timer对象,并使用其schedule方法来实现。下面是一个示例代码:
```java
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("时间到,执行任务1");
}
}, 1000);
}
}
```
在这个示例中,我们创建了一个Timer对象,并使用schedule方法来安排一个任务在指定的延迟时间后执行。在这个例子中,任务会在1000毫秒后执行,打印出"时间到,执行任务1"。
另外,在MyTimer类中也可以实现一次性定时器。可以通过创建一个队列来存储任务,并在指定时间到达时执行任务。可以使用一个线程来扫描队列,并判断任务的执行时间。下面是一个示例代码:
```java
public class MyTimer {
private BlockingQueue<MyTask> queue;
private Object locker = new Object();
public MyTimer() {
queue = new PriorityBlockingQueue<>();
Thread t = new Thread(() -> {
while (true) {
try {
MyTask task = queue.take(); //获取队首元素
long curTime = System.currentTimeMillis(); //获取当前时间
if (curTime >= task.getTime()) {
//时间到,执行任务
task.getRunnable().run();
} else {
//时间没到,把元素再放回到队列中
queue.put(task);
synchronized (locker) {
locker.wait(task.getTime() - curTime);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
}
public void schedule(Runnable task, long delay) throws InterruptedException {
MyTask myTask = new MyTask(task, delay);
queue.put(myTask); //把任务放入队列中
synchronized (locker) {
//如果在线程等待期间,有新任务进入队列,则提前唤醒线程
locker.notify();
}
}
}
```
在这个示例中,我们创建了一个MyTimer类,通过创建一个线程来扫描任务队列。当任务的执行时间到达时,执行任务。如果时间还未到达,将任务再次放回队列,并使用wait方法使线程等待。当有新任务进入队列时,通过notify方法提前唤醒线程。使用schedule方法来安排任务的执行,传入任务和延迟时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [Java定时器](https://blog.csdn.net/m0_67683346/article/details/126978831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文