在程序计算时做点什么

时间:2015-03-19 13:55:19

标签: java timer

我正在尝试创建一个必须处理一些相当长的计算(几分钟)的程序。在所述计算期间,程序将在每次偶然发现某些数据时打印消息。到现在为止还挺好。

现在对于棘手的部分:我怎么能这样做,如果程序在一段时间内没有打印任何东西,还会发生其他一些动作?

即:

while(true){
    //do stuff
    if(good stuff happens) System.out.println("GOTCHA!");
    if(nothing happens for some seconds)
        System.out.println("Don't worry, I'm still running!");
}

正如您所看到的,我正在使用Java,但C / C ++也可以。

4 个答案:

答案 0 :(得分:2)

好吧,你应该开始一个新线程。看看cuncurrency in Java。它被归类为“必不可少”,这就是为什么我只是建议你自己看看而不给出详细的答案。

答案 1 :(得分:0)

直接取自System javadoc。

例如,要测量一些代码执行的时间: long startTime = System.nanoTime();

// ...正在测量的代码...

long estimatedTime = System.nanoTime() - startTime;

答案 2 :(得分:0)

ScheduledExecutorService可以帮助您解决此问题。

您可以安排某个函数每隔n秒运行一次,让它检查计算是否仍在运行,如果它正在运行,则输出一些消息或其他信息。计算完成后,您可以停止执行程序,或者只是取消计划任务,以防您想将执行程序用于其他任务。

执行程序服务将提供和管理自己的后台线程,这样您就不必处理它,而您的计算仍然可以在主线程上连续运行。

答案 3 :(得分:0)

Java提供类似的东西,它本身无法提供进度,但能够管理Future<T>类的异步任务。由于您需要向用户提供当前操作任务的反馈,您至少需要两个线程(Future<T>线程和报告线程),如:

public class ReportThread extends Thread {
  final int delay;
  boolean finished;

  ReportThread() { finished = false; }
  void done() { finished = true; }

  public void run() {
    while (!finished) {    
      Thread.sleep(delay);
      System.out.println("Computing long task..");
    }
  }
}

ReportThread report = new ReportThread(1000);
report.start();
ExecutorService service = new ExecutorService();
Future<T> future = service.submit(new Future<T>(new Callable<T>() {
  public T call() {
    // long task implementation
  })
);
T result = future.get();
report.done();

以下是您需要注意的例外情况。

应该可以使用ScheduledExecutorService来安排您的计算操作(延迟为0且没有固定费率)您的报告任务(具有初始延迟和固定费率),以便您可以等到获得第一个结果然后取消第二个。