当前位置: 首页 > 知识库问答 >
问题:

RejectedExecutionException来自单线程执行程序

夏侯博
2023-03-14
  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方法,会发生什么?它会启动同样多的线程还是会等待一个线程完成后再启动另一个线程?

共有1个答案

米子轩
2023-03-14

请参见此处: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();
    }
}
 类似资料:
  • 问题内容: 在我们的一项服务中,有人添加了这样的代码(简化): 有时 由于以下原因而失败: 在大多数情况下,错误是-我完全理解。编写该代码的人从未调用过,因此使它保持了太多的生命。当然,为每个方法调用创建单独的执行程序服务都是很糟糕的,并且会被更改;但这正是为什么看到错误的原因。 我不明白的是为什么会被抛出,特别是在这里被抛出。 那里的代码注释有一定道理: 如果我们无法将任务排队,则尝试添加一个新

  • 6.7.1.单线程执行 Android程序默认运行在单线程之下。单线程顺序执行所有的操作,这一操作完成之前,下一个操作绝不会执行。这一行为被称作“阻塞”(blocking)。 图6.8. 单线程执行 这个线程也被称作UI线程,意思是程序中用户界面的相关操作都在这里执行。除处理所有UI元素的渲染之外,事件的响应也由它负责。比如触摸屏幕、点击按钮等等。图6.8 "单线程执行"展示了在只有一个UI线程时

  • 除了接口比普通线程(例如管理)有一些优势之外,执行以下操作之间是否存在真正的内部差异(性能差异大、资源消耗……): 以及: 我只问这里的一个线索。

  • 我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- > 如果有理想的线程,并且随着任务的到来,将该任务分配到队列中,而不是将其添加到队列中。 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了线程池执行程序的java 1.5版本的执行方法。 新守则如下:- 遗留代码如下所示:- 现在正

  • 我正纠结于这样一个问题:一个可调用的任务在顺利地工作了一天的大部分时间后,被放入Java单线程执行器中,而很明显GET从来没有被执行过。提交新任务的后续调用失败,似乎已死。此时,生成任务的客户端将停止服务,直到流程可以重新启动,这在工作时间是不可能的。 一些背景:多个高吞吐量生产者线程将其任务放置到自己专用的上并立即返回。低延迟对于生产者线程非常重要。在生产者线程和执行器线程之间存在一对一的关系。

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....