有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java执行器服务。关闭。当任务队列变为空时,如何关闭executor?

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();
        }
    }
}

我之所以得到RejectedExecutionException,是因为在shutdown之后调用了内部executor.execute。在这种情况下我怎么能等遗嘱执行人呢


共 (1) 个答案

  1. # 1 楼答案

    你必须知道什么时候不再有任务了。这不是你能猜到的。将关闭移到第一个任务中,它将按照您的预期运行。i、 e.只有当你知道你不打算添加更多任务时,才呼叫关机

    另一种方法是使用

    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
    

    然后退出。注意:如果任何线程仍在运行,程序将不会退出