
org.rx.core.WheelTimer Maven / Gradle / Ivy
package org.rx.core;
import io.netty.util.HashedWheelTimer;
import io.netty.util.Timeout;
import io.netty.util.Timer;
import io.netty.util.TimerTask;
import lombok.*;
import org.rx.bean.$;
import org.rx.util.function.Action;
import org.rx.util.function.Func;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.LongUnaryOperator;
import static org.rx.bean.$.$;
import static org.rx.core.App.proxy;
import static org.rx.core.Extends.ifNull;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class WheelTimer extends AbstractExecutorService implements ScheduledExecutorService {
@RequiredArgsConstructor
class Task implements TimerTask, TimeoutFuture {
final Object id;
final TimeoutFlag flag;
final Func fn;
final LongUnaryOperator nextDelayFn;
long delay;
long expiredTime;
volatile Timeout timeout;
volatile Future future;
long p0, p1, p2;
@SneakyThrows
@Override
public synchronized void run(Timeout timeout) throws Exception {
future = Tasks.run(() -> {
boolean doContinue = flag == TimeoutFlag.PERIOD;
try {
return fn.invoke();
} finally {
if (ThreadPool.asyncContinueFlag(doContinue)) {
newTimeout(this, delay, timeout.timer());
} else if (id != null) {
hold.remove(id);
}
}
});
notifyAll();
}
@Override
public String toString() {
return String.format("WheelTask-%s[%s]", ifNull(id, Strings.EMPTY), ifNull(flag, TimeoutFlag.SINGLE));
}
@Override
public Timer timer() {
return timeout.timer();
}
@Override
public TimerTask task() {
return timeout.task();
}
@Override
public boolean isExpired() {
return timeout.isExpired();
}
@Override
public boolean isCancelled() {
return timeout.isCancelled();
}
@Override
public boolean cancel() {
return cancel(true);
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
if (future != null) {
future.cancel(mayInterruptIfRunning);
}
if (timeout != null) {
//Timeout maybe null when parallel invoke tasks of the same id
return timeout.cancel();
}
return true;
}
@Override
public boolean isDone() {
return future != null && future.isDone();
}
@Override
public T get() throws InterruptedException, ExecutionException {
synchronized (this) {
if (future == null) {
wait();
}
}
if (future == null) {
throw new InterruptedException();
}
return future.get();
}
@Override
public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
synchronized (this) {
if (future == null) {
wait(TimeUnit.MILLISECONDS.convert(timeout, unit));
}
}
if (future == null) {
throw new TimeoutException();
}
return future.get(timeout, unit);
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(expiredTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
if (!(o instanceof Task)) {
return 0;
}
long otherExpiredTime = ((Task>) o).expiredTime;
return Long.compare(expiredTime, otherExpiredTime);
}
}
class EmptyTimeout implements Timeout, TimerTask {
@Override
public Timer timer() {
return timer;
}
@Override
public TimerTask task() {
return this;
}
@Override
public boolean isExpired() {
return true;
}
@Override
public boolean isCancelled() {
return true;
}
@Override
public boolean cancel() {
return true;
}
@Override
public void run(Timeout timeout) throws Exception {
}
}
static final long TICK_DURATION = 100;
final HashedWheelTimer timer = new HashedWheelTimer(ThreadPool.newThreadFactory("TIMER"), TICK_DURATION, TimeUnit.MILLISECONDS);
final Map
© 2015 - 2025 Weber Informatics LLC | Privacy Policy