我想运行Java代码一定时间,例如16个小时!我有一个大约运行一个小时的Java代码,我希望它可以重复运行16小时。因此,我有一个用户通过Jenkins传递的参数!我使用访问此值
System.getenv("Duration");
现在,我想在指定时间后退出执行。因此,假设用户选择了16,脚本应运行16个小时,然后退出。
如图所示,接受来自Jenkins用户的输入
我看到了其他一些问题,但是其中大多数问题与计时器处理的时间不是几秒钟就是几分钟。我需要一个有效的解决方案。谢谢 :)
仅供参考-环境-Jenkins + TestNG + Maven + Java
编辑:
long start = System.currentTimeMillis(); long end = start + durationInHours*60*60*1000; while (System.currentTimeMillis() < end) { //My code here runs for approx. 50 mins! }
现在假设用户选择值3小时,我希望3小时后退出while循环。但这并没有发生,因为在检查while条件时还没有完成3个小时。因此即使进入了第4次(因为经过的时间为150分钟而少于180分钟)它也进入了while条件,它在3小时10分钟后结束了。
如何在达到180分钟后退出while循环?
PS-我可以先做数学运算((迭代= durationFromUser / codeDuration),然后运行for循环,但是我不想这样做,因为我的脚本长度可能有所不同。
编辑2:
boolean alive = true; Timer timer = new Timer(); @Test() //Annotation from TestNG public void public void jenkinsEntryPoint() { String duration = System.getenv("Duration"); int durationInHours=Integer.parseInt(duration); long end = System.currentTimeMillis() + durationInHours*60*60*1000; TimerTask task = new TimerTask() { public void run() { alive = false; }; timer.schedule(task, end); while (alive) { //My code here runs for approx. 50 mins! function1(); } } void function1() { function2(); } private void function2() { for(i=0;i<8;i++) { while(alive) { //long running code sleep(1000); //Some more code sleep(2000); //Some more code //Suppose time elapses here, I want it to quit //But its continuing to execute . . . . } } }
我尝试了ScheduledThreadPoolExecutor,它起作用了!
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); exec.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("Time's Up According To ScheduledThreadPool"); alive = false; } }, durationInHours, 1, TimeUnit.HOURS);
此功能将在“ durationInHours”之后执行。
谢谢@TedBigham :)