-
Notifications
You must be signed in to change notification settings - Fork 0
/
Timer.java
47 lines (42 loc) · 1.43 KB
/
Timer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Created by Alexandra on 9/13/2016.
*/
public class Timer implements Runnable {
private static final SortedSet<Task> tasks = new TreeSet<>(new TaskComparator());
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
@Override
public void run() {
scheduler.scheduleWithFixedDelay(this::checkTasks, 0, 100, TimeUnit.MILLISECONDS);
}
private void checkTasks() {
synchronized (tasks) {
if (tasks.isEmpty()) {
return;
}
final long now = System.currentTimeMillis();
for (Iterator<Task> it = tasks.iterator(); it.hasNext(); ) {
final Task task = it.next();
if (task.getTime() <= now) {
try {
task.getCallable().call();
it.remove();
} catch (Exception e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
public void addTask(Callable callable, long delay) {
synchronized (tasks) {
tasks.add(new Task(System.currentTimeMillis() + delay, callable));
}
}
}