我有一个需要在Trigger上执行的任务(比如在需要执行时为该函数传递一个布尔值true)。
为此,可以使用任何线程机制,如Thread,TimerTask或ScheduledThreadPool等。其中请建议最好的方法,并且所使用的线程或机制必须在其任务之后释放资源,因为触发间隔是波动的。
答案 0 :(得分:0)
您可以使用RxJava,它提供用于处理可观察事件流的反应式编程API。它基于Reactive Extensions for .NET。事件可以是基于时间的(例如,Observable.interval()
);他们可能来自一个集合(Observable.from(Iterable)
);或者您可以使用Subject
自行发布。
//
// NOTE: For brevity, I'm using Java 8 syntax (lambdas and method references).
//
public static void main(String[] args) throws Throwable {
System.out.println("Main Thread: " + Thread.currentThread().getId());
final CountDownLatch done = new CountDownLatch(1);
final Observable<Trade> trades = simulateTrades();
trades.where(t -> Math.abs(t.quantity) * t.price >= 250000)
.observeOn(Schedulers.threadPoolForIO())
.subscribe(
Main::logLargeTrade,
e -> { e.printStackTrace(); done.countDown(); },
done::countDown
);
done.await();
System.out.println("Done!");
}
private static Observable<Trade> simulateTrades() {
final Random r = new Random();
return Observable.interval(50L, TimeUnit.MILLISECONDS)
.take(100)
.map(
t -> new Trade(
Instant.now(),
"AAPL",
(r.nextInt(9) + 1) * 100,
500d + r.nextDouble() * 5d
)
);
}
private static void logLargeTrade(Trade t) {
System.out.printf(
"[%d: %s] Large Trade: %d %s @ %f%n",
Thread.currentThread().getId(),
t.timestamp.atOffset(ZoneOffset.UTC).toLocalDateTime(),
t.quantity,
t.symbol,
t.price
);
}
final static class Trade {
final Instant timestamp;
final String symbol;
final double price;
final int quantity;
Trade(Instant time, String symbol, int quantity, double price) {
this.timestamp = time;
this.symbol = symbol;
this.quantity = quantity;
this.price = price;
}
}
此处,trades
是一系列交易活动。我们的触发条件匹配价值至少为250,000美元的交易,因此我们使用where()
仅包含与该条件匹配的交易。我们希望触发器操作在线程池上执行,因此我们使用observeOn()
来指定使用线程池的调度程序。 subscribe()
创建 - 您猜对了 - 对已过滤事件流的订阅。这个特殊的重载让我们将onNext
,onError
和onCompleted
回调作为lambdas传递。
simulateTrades()
方法创建我们订阅的事件流。通常,这些事件将通过消息传递系统进入,或者由进程中的其他组件发布。为了举例,我只使用一个计时器间隔来发布每秒10次交易,并在100次交易后终止。