Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing和要调度的线程_Java_Multithreading_Swing - Fatal编程技术网

Java Swing和要调度的线程

Java Swing和要调度的线程,java,multithreading,swing,Java,Multithreading,Swing,我试图提出一个概念,在GUI中我可以给出一个查询并指定步调和持续时间。就像我给它2分钟和5小时。这意味着每2分钟运行一次给定的查询,在接下来的5小时。虽然我的GUI已经准备好并能够提交查询…但我无法引入上述指定的时间概念。尽管我确信这可以通过线程来完成…我发现很难编写代码…这里有人能帮我解决这个问题的基本方法吗?有没有比线程更好、更简单的方法?请帮助..以您的示例为例,如果您有一个查询需要每2分钟运行5小时,您需要做的是计算您希望查询执行的次数 2 minutes = 120 seconds.

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

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

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

Number of times (iterations) = 18,000 / 120 = 150 iterations.
因此,您需要每120秒或120000毫秒提交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的类,并将查询结果传递回GUI。由于您不在Swing事件调度线程上,因此必须使用SwingUtilities.invokeLater方法来实际进行GUI更改


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

举个例子,每10秒执行一次,持续一小时。你应该能够很容易地将其适应你的用例。谢谢assylias…我正在阅读教程。让我试试看这是否有帮助。谢谢Gilbert。但是有一个问题。在我的代码中,我必须传递150次迭代和120秒作为输入,对吗?你有没有一个示例代码可以将这样的值传递给线程..我对Java非常陌生,线程是我在过去几天才研究的东西..所以没有更多的帮助会非常好!!非常感谢您…让我在提供的基础上工作,然后返回我的观察结果..+1-作为旁注,计时器事件不会在EDT内触发,因此您需要重新同步任何UIupdates@MadProgrammer:是的。我们也没有处理来自查询的任何响应。