0

简单的问题,这段代码是否有效,并且不会留下任何类型的资源泄漏:

    // code...
    final int delaySecs = 60;
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(delaySecs * 1000);
                // code to do whatever delayed single-shot action
            } catch (InterruptedException ex) { /* skip action */ }
        }
    }).start();
    // more code...

如果它无效,我应该使用这样的Thread子类来启用setDaemon(true)调用:

class DaemonThread extends Thread {
    public DaemonThread(Runnable target) {
        super(target);
        setDaemon(true);
    }
}

或者是其他东西?

4

3 回答 3

4

Java 从 1.5 开始就为您的用例提供了特定的支持,因此最好建议您使用它:

ScheduledExecutorService s = Executors.newScheduledThreadPool(1);
s.schedule(new Runnable() { ...my task, no Thread.sleep()... },
   1, TimeUnit.MINUTES);
s.shutdown();

这将实现适当的延迟并在之后进行清理。

于 2013-01-09T10:02:34.307 回答
3

为什么不实例化Thread, 调用setDaemon()它然后调用 via start()?我认为您不需要Thread子类。

例如

Thread t = ...
t.setDaemon(true);
t.start();
于 2013-01-09T09:45:51.890 回答
1

最好的方法是将任何应该执行的逻辑包装到 Runnable 中,并将执行留给 ExecutorService。

Executor 将负责停止/重用线程(如果有)

MyRunnable runnable = new MyRunnable();
ExecutorService executor = Executors.newFixedThreadPool(1);   
executor.execute(runnable);

这样您就可以将程序逻辑与执行/生命周期管理分开。执行器还能够处理线程中的异常/中断。这将允许您在不打开新线程的情况下重新启动后台逻辑。

于 2013-01-09T09:58:04.253 回答