创建一个用于计时的线程并重新启动另一个线程

时间:2010-08-10 02:44:22

标签: java concurrency

我已经实现了以下类,它跟踪执行算法所需的时间

public class MyTimer extends Thread{

    long timeElapsed = 0;

    public MyTimer(String parameters){
        //initilise staff
    }

    pubic void run(){
      long startTime = System.currentTimeMillis();

      //DO SOME THINGS THAT TAKE TIME

      timeElapsed = System.currentTimeMillis() - startTime;
      System.out.println("time elapsed = " + timeElapsed");

    }
}

有时候MyTimer会花费很多时间,所以我想创建另一个类来控制它。如果MyTimer没有在30秒内完成,那么我想停止线程并使用新参数重新启动它。如果它在不到30秒内完成,那么我希望能够存储timeElapsed并再次重启MyTimer。 我虽然这很简单,但我已经搞乱线程池timeCountLathces并监视异常.....所以,有什么方法可以做到这一点吗?另一种解决方案是手动逐个运行我的500个测试....

提前谢谢

2 个答案:

答案 0 :(得分:2)

让你的生活更艰难的问题可能是你必须解决的问题是你如何打断你长期运行的代码?如果它在循环中本身很短(即经常循环),那么你可以在循环中检查以决定是停止还是继续。那将是理想的。但是,如果长时间运行的任务要转移到数据库,或者单个java语句运行了多年,那么您将不得不尝试interrupting该线程(例如monitoredThread.interrupt())。中断正在运行的线程可能会导致错误被记录等,但如果代码运行良好,中断将导致它停止正在执行的操作并返回。

希望有所帮助。

答案 1 :(得分:0)

您应该考虑使用Hudson运行您的测试/构建。您可以将Hudson构建(您的500个测试)配置为在可自定义的时间段后未完成时自动超时。

当然,你不会在逐个测试的基础上得到失败,因为每次测试都不会给出任意30秒,但是你将使用持续积分,这是朝着正确方向迈出的一步。 / p>

Hudson下载并设置约5分钟:http://hudson-ci.org/