How to run a thread for one hour in java

Tags: ,



I will be receiving an attribute and I want to run a job for that attribute for 1 hour – monitoring and logging things related to that attribute. After that one hour, the job will stop.

Is there a way to run a task, thread or a job for one hour given a id for that thread? As far as I know, the SchedulerExecutorService runs with a delay and after a certain interval. But how can I stop the job for that particular thread after one hour.

One more thing to note here is – there is a thread which will run for one hour and terminate. And there is another thread inside the one hour thread which will be doing some work every 5 minutes. So all in all I want a job to run for one hour and then inside that thread, another thread which will run every 5 minutes.

Kindly help.

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

Answer

The only proper way to terminate a thread is for a thread itself to exit the run() method. Do not stop, interrupt or kill the thread – read the documentation for explanation why.

Do something like this:

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


Source: stackoverflow