简体   繁体   中英

Run thread only for one minute in java

What the best practice to run thread only for some period? I can easily check curentTime and close the thread after in worked for some time, but I think it's not the right way.

这取决于您要实现的目标,但总的来说,您提到的从一开始就测量时间的方法并没有那么错误。

I would code it like this:

private static class MyTimerTask extends TimerTask {
    private final Thread target;
    public MyTimerTask(Thread target) { this.target = target; }
    public void run() {
        target.interrupt();
    }
}

public void run() {
    Thread final theThread = Thread.currentThread();
    Timer timer = new Timer();
    try {
         timer.schedule(new MyTimerTask(theThread), 60000});
         while(!theThread.interrupted()) {
             ....
         }
    } finally {
         timer.cancel();
    }
}

... which is Hovercraft described, except using interrupt instead of an ad-hoc flag. Using interrupts has the advantage that some I/O calls are unblocked by an interrupt, and some libraries will respect it.

I'm surprised (and deeply disappointed) that no one has mentioned the Executors framework . It has usurped the Timer framework (or at least the java.util.Timer class) as the "goto" for scheduled tasks.

For instance,

// Start thread
final Thread t = new Thread(new Runnable(){
    @Override
    public void run(){
        while(!Thread.currentThread().isInterrupted()){
            try{
                // do stuff
            }
            catch(InterruptedException e){
                Thread.currentThread().interrupt();
            }
        }
    }
});
t.start();

// Schedule task to terminate thread in 1 minute
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.schedule(new Runnable(){
    @Override
    public void run(){
        t.interrupt();
    }
}, 1, TimeUnit.MINUTES);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM