-1

我试图提出一个概念,在 GUI 中我可以给出一个查询并指定起搏和持续时间。就像我给它 2 分钟和 5 小时 ..这意味着每 2 分钟运行下一个 5 小时的给定查询。 .尽管我的 GUI 已准备好并且能够提交查询...我无法引入上述指定的时间概念..尽管我确信这可以通过线程来完成...我发现很难对其进行编码。 ..这里的任何人都可以帮助我解决这个问题的基本方法吗?有没有比线程更好更简单的方法?请帮忙..

4

1 回答 1

3

以您的示例为例,如果您有一个查询要每 2 分钟运行 5 个小时,您需要做的是计算您希望查询执行的次数。

2 minutes = 120 seconds.
5 hours = 18,000 seconds.

Number of times (iterations) = 18,000 / 120 = 150 iterations.

因此,您需要每 120 秒(或 120,000 毫秒)提交 150 次查询。

如果要使用 GUI 提交多个查询,则必须使用线程。

编辑添加:根据 assylias 的评论,这里有一些代码

public void runQuery(int interval, int duration) {
    final Runnable query = new Runnable() {
        @Override
        public void run() {
            // Run query
        }
    };
    ScheduledExecutorService scheduler = Executors
            .newScheduledThreadPool(1);
    final ScheduledFuture<?> queryHandle = scheduler.scheduleAtFixedRate(
            query, 0, interval, TimeUnit.SECONDS);
    scheduler.schedule(new Runnable() {
        @Override
        public void run() {
            queryHandle.cancel(true);
        }
    }, duration, TimeUnit.SECONDS);
}

只是使用线程,这是另一个版本。

public void runQuery(int interval, int duration) {
    final Runnable query = new Runnable() {
        @Override
        public void run() {
            // Run query
        }
    };
    int iterations = duration / interval;
    for (int i = 0; i < iterations; i++) {
        new Thread(query).start();
        for (int j = 0; j < interval; j++) {
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
            }
        }
    }
}

在这些Runnable代码示例中,查询只是一个占位符。

您将不得不编写一个实现Runnable查询结果并将其传递回 GUI 的类。由于您不在 Swing Event Dispatch 线程上,因此您必须使用该SwingUtilities.invokeLater()方法来实际进行 GUI 更改。

您可以将您的类的一个实例传递给这些线程方法之一,以便在您传递的时间间隔和持续时间内执行。

于 2013-01-24T18:42:05.923 回答