2013-01-24 69 views
-1

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

+2

[ScheduledExecutorService javadoc](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html)用一个例子每隔10秒做一个小时一小时。你应该能够很容易地适应你的用例。 – assylias

+0

谢谢assylias ...我正在通过教程..我试着看看这是否有帮助.. –

回答

3

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

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

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

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

如果要使用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。

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

+0

谢谢吉尔伯特..但有一个问题..在我的代码中,我将不得不传递150个interations和120秒作为输入正确?你有一个示例代码,将这些值传递给线程..我对Java很新颖,线程是我只在过去几天探索的东西..所以更多的帮助将非常棒! –

+0

非常感谢你......让我在提供的基础上工作,并回到我的观察结果.. –

+0

+1 - 正如附注一样,计时器事件不会在EDT内触发,因此您需要重新同步任何UI更新 – MadProgrammer