2
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Main
{
    public static void main(String[] args)
    {
        final ExecutorService executor = Executors.newFixedThreadPool(10);
        executor.execute(new Runnable()
        {
            @Override
            public void run()
            {
                for (int i = 0; i < 10; i++)
                    executor.execute(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                             System.out.println("run");
                        }
                    });
            }
        });
        executor.shutdown();
        try
        {
            executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

私は after と呼ばれるRejectedExecutionException内部のために取得します。この場合、エグゼキュータを待つにはどうすればよいですか?executor.executeshutdown

4

1 に答える 1

2

いつタスクがなくなるかを知る必要があります。それはあなたのために推測できるものではありません。シャットダウンを最初のタスクに移動すると、期待どおりに動作します。つまり、タスクを追加しないことがわかっている場合にのみ、shutdown を呼び出します。

別の方法として、

final ExecutorService executor = new ThreadPoolExecutor(0, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

これはエグゼキューターをシャットダウンしませんが、すべてのスレッドを停止し、エグゼキューターが不要になったら破棄できます。注: 後でタスクを追加すると、必要に応じてスレッドが開始されます。

final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 100, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
for (int i = 0; i < 1000; i++)
    executor.submit(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            Thread.sleep(2);
            return null;
        }
    });
while (executor.getQueue().size() > 0) {
    System.out.println("Queue " + executor.getQueue().size() + ", Pool size " + executor.getPoolSize());
    Thread.sleep(200);
}
executor.setCorePoolSize(0);
while (executor.getPoolSize() > 0) {
    System.out.println("Pool size " + executor.getPoolSize());
    Thread.sleep(200);
}
System.out.println("Pool size " + executor.getPoolSize());

版画

Queue 946, Pool size 10
Queue 32, Pool size 10
Pool size 10
Pool size 0

そして終了します。注: スレッドがまだ実行されている場合、プログラムは終了しません。

于 2013-02-03T08:47:12.803 に答える