在Java中执行触发器上的任务

时间:2013-11-08 13:33:13

标签: java threadpool

我有一个需要在Trigger上执行的任务(比如在需要执行时为该函数传递一个布尔值true)。

为此,可以使用任何线程机制,如Thread,TimerTask或ScheduledThreadPool等。其中请建议最好的方法,并且所使用的线程或机制必须在其任务之后释放资源,因为触发间隔是波动的。

1 个答案:

答案 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()创建 - 您猜对了 - 对已过滤事件流的订阅。这个特殊的重载让我们将onNextonErroronCompleted回调作为lambdas传递。

simulateTrades()方法创建我们订阅的事件流。通常,这些事件将通过消息传递系统进入,或者由进程中的其他组件发布。为了举例,我只使用一个计时器间隔来发布每秒10次交易,并在100次交易后终止。