要调度的Java Swing和Threads

时间:2013-01-24 18:35:01

标签: java multithreading swing

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

1 个答案:

答案 0 :(得分: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);
}

只需使用Thread,这是另一个版本。

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更改。

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