java - 来自单线程执行器的 RejectedExecutionException

标签 java multithreading concurrency runnable executorservice

下面是我的方法,其中我有单线程执行器在 run 方法中执行一些任务。

  private void trigger(final Packet packet) {

    // this line is throwing exception
    Executors.newSingleThreadExecutor().execute(new Runnable() {
      @Override
      public void run() {
        // some code here
      }
    });
  }

下面是我得到的异常,我不确定为什么?解决此问题的最佳方法是什么?

error= java.util.concurrent.RejectedExecutionException: Task com.abc.stuffProc$2@e033da0 rejected from java.util.concurrent.ThreadPoolExecutor@76c2da8f[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
    at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:628)

如果多次调用我的 trigger 方法并且它仍在处理我之前线程的 run 方法,会发生什么情况?它会启动尽可能多的线程还是会等待一个线程完成然后启动另一个线程?

最佳答案

参见此处:What could be the cause of RejectedExecutionException

正如您从错误日志中看到的,您的 ThreadPoolExecutor 已终止。

也许这就是你想要的:

private void trigger(final Packet packet) {

    executor.execute(new Runnable() {
      @Override
      public void run() {
        // some code here
      }
    });
  }

private final ExecutorService executor = Executors.newFixedThreadPool(10);

编辑重现问题:

public static void main(String[] args) {
    final ExecutorTest et = new ExecutorTest();
    for (int i = 0; i < 50000; i++) {
        et.trigger(i);
    }
    System.out.println("Done");
}

private void trigger(int i) {

    try {
        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                Thread.sleep(1000);
            } catch (final InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        });
    } catch (final Exception e) {
        System.out.println("Test " + i + " with " + Thread.activeCount());
        e.printStackTrace();
    }
}

关于java - 来自单线程执行器的 RejectedExecutionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47106473/

相关文章:

performance - Scala Actor : long running io operations

concurrency - 乐观与多版本并发控制 - 差异?

java - 如何将 ArrayList<LinkedHashMap<String, Comparable>> 转换为 Comparable?

java - 将图像放在动态生成的 TextView 左侧的问题

java - 我不明白为什么这个程序不起作用。多态性

c# - WaitOne() 永远等待,即使所有事件都已触发

java外部线程(在它使用的类文件之外)

java - 无法在react-native模拟器上运行应用程序

c - 服务器中的 Leader/Follower pthread 实现

multithreading - Golang 如何在 goroutine 之间共享变量?