如何在java中运行一个线程一个小时



我将接收一个属性,我想为该属性运行一个作业1小时,监视和记录与该属性相关的事情。一个小时后,工作将停止。

有没有一种方法可以在给定线程id的情况下运行一个任务、线程或作业一小时?据我所知,SchedulerExecutorService运行时会有延迟,并在一定的时间间隔后运行。但是,我怎么能在一个小时后停止该特定线程的作业呢。

这里需要注意的一点是,有一个线程将运行一个小时并终止。在一个小时的线程中还有另一个线程,它将每5分钟做一些工作。所以总的来说,我希望一个作业运行一个小时,然后在那个线程内,另一个线程每5分钟运行一次。

请帮忙。

class Task1 implements Runnable {
String abc;
private final ScheduledExecutorService monitorService;
private boolean isShutDown = false;
public Task1(String abc) {
this.abc = abc;
this.monitorService = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("checker-%s").build());
}
@Override
public void run()
{
Stopwatch stopwatch = Stopwatch.createStarted();
monitorService.scheduleAtFixedRate(new Task2(abc), 2, 300000, TimeUnit.MILLISECONDS);
long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS);
if(elapsed == 3600000) {
shutdownAndAwaitTermination(monitorService);
isShutDown = monitorService.isShutdown() || monitorService.isTerminated();
}
}
public boolean isShutDown()
{
return isShutDown;
}
}

public class Task2 implements Runnable //This should run every 5 minutes
{
private String abc;
public Task2(abc) {
this.abc = abc;
}
@Override
public void run()
{
System.out.println(abc);
}
}
Task1 task1 = new Task1("abc");
task1.run(); //This should run for 1 hour and terminate

终止线程的唯一正确方法是线程本身退出run()方法不要停止、中断或终止线程-请阅读文档以了解原因。

这样做:

public void run() {
long startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 3600000) {
// ... do your stuff here ...
}
}

最新更新