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

3

をインスタンス化しThreadsetDaemon()それを呼び出してから、経由で呼び出すだけでは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 に答える