我正在尝试创建一个必须处理一些相当长的计算(几分钟)的程序。在所述计算期间,程序将在每次偶然发现某些数据时打印消息。到现在为止还挺好。
现在对于棘手的部分:我怎么能这样做,如果程序在一段时间内没有打印任何东西,还会发生其他一些动作?
即:
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 ++也可以。
答案 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且没有固定费率)您的报告任务(具有初始延迟和固定费率),以便您可以等到获得第一个结果然后取消第二个。