0

だから、私は次のものを持っているとしましょうScheduledExecutorService

public class Foo
{
        private ScheduledExecutorService exec;

        public Foo()
        {
            exec = Executors.newScheduledThreadPool(NUM_OF_TASKS);
        }

        public void executeOnce()
        {
            exec.schedule(new Runnable(){
                @Override
                public void run()
                {
                    Foo.this.doSomething();
                }}, DELAY, TimeUnit.MILLISECONDS);
        }
}

現在は、定期的なタスク (ディレクトリ ポーリングなど)execを実行するために使用されます。しかし、この 1 つのタスク (つまり) は1 回実行されますが、遅延が必要です。それで、このタスクを実行するために使用することにしましたが、これは良い設計ですか? 代わりに、 を作成してから を呼び出す必要がありましたか? 例えば、executeOnceexecnewSingleThreadExecutorshutdown

public void executeOnce()
{
    // Execute task and wait 'til completion      
    ExecutorService exec = Executors.newSingleThreadExecutor();
    try {
        exec.submit(new Runnable(){
            @Override
            public void run() 
            {   
                try 
                {
                    Thread.sleep(DELAY);
                } catch (InterruptedException e) {
                }
                Foo.this.doSomething()
            }   
        }).get();
    } catch (InterruptedException e) {
    } catch (ExecutionException e) {
    }

    // Shutdown executor service    
    exec.shutdownNow();        
 }

後者を実装するメリットはありますか?

4

2 に答える 2

1

execが他のタスクに再利用される場合、最初の部分はよりエレガントであると私は思います。スレッドの作成は簡単な作業ではありません。ランナブルが1回だけ実行される場合でも、スレッディングの一般的なアプローチは、単一のスレッドプールを作成し、それらにランナブルをスローすることです。生活を楽にし、スレッドプールなどを一元化します...

于 2011-05-04T16:03:06.173 に答える
1

通常のタスクと 1 回限りのタスクが何らかの形関連しており、通常のタスクのスケジューリングがそれほど重要ではなく、実行の (可能性のある) 遅延が問題になる場合は、1 回限りのタスクを単純に実行します。同じエグゼキュータで。

別のエグゼキュータを使用する利点は、通常のタスクが干渉なしでスケジュールされることです。ただし、ここでshutdownNow()ほぼ確実に望ましい効果が得られないため、単純なshutdown()方が適切です。

于 2011-05-04T16:04:32.017 に答える