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

了解ThreadPoolExecitor内部工作

车嘉实
2023-03-14

我有以下代码:

public class ExecFramework implements Runnable {
int i;

public ExecFramework() {

}

public ExecFramework(int i) {
    this.i = i;
}

public void run() {
    System.out.println(Thread.currentThread().getName() + " " + i);
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {

    ExecutorService pool=new ThreadPoolExecutor(2, 10, 5000,TimeUnit.SECONDS, new ArrayBlockingQueue(2));
    for (int i = 0; i < 20; i++) {
        Runnable obj=new ExecFramework(i);
        pool.execute(obj);
    }
    pool.shutdown();
    while(pool.isTerminated()){
        System.out.println("ExecutorService is terminated");
    }

}

}

我对ThreadPoolExecitor工作方式的了解是否正确:

  1. 如果NumberOfThreadRunning

根据第3点。我应该能够使用ThreadPoolExecutor执行20个任务。

为什么上述代码的输出是?

html prettyprint-override">pool-1-thread-5 6
pool-1-thread-4 5
pool-1-thread-3 4
pool-1-thread-1 0
pool-1-thread-2 1
pool-1-thread-6 7
pool-1-thread-7 8
pool-1-thread-8 9
pool-1-thread-9 10
pool-1-thread-10 11
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task executionFramework.ExecFramework@232204a1 rejected from java.util.concurrent.ThreadPoolExecutor@4aa298b7[Running, pool size = 10, active threads = 10, queued tasks = 2, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at executionFramework.ExecFramework.main(ExecFramework.java:88)
pool-1-thread-8 2
pool-1-thread-6 3

共有1个答案

蒙弘图
2023-03-14

文件上说:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

在第节中,拒绝了任务。

在你的情况下,我想:

当执行器对最大线程和工作队列容量使用有限边界并且饱和时

发生。

 类似资料:
  • 我有一个xml布局,它有以下视图:滚动视图->Relationvelayout->Some views+Tablayout+ViewPager->RecylerView(在ViewPager的片段中)。ViewPager有一些固定的高度(保持它“wrap_content”根本不会显示它)。现在的问题是Recylerview永远不会滚动。我已经尝试了几个已经发布的解决方案,比如在“嵌套滚动视图”中包

  • 问题内容: 请帮助我了解newFixedThreadPool(或Cached)的内部流程 当我们编写以下语句时,ExecutorService e = Executors.newFixedThreadPool(3); e.execute(runaable1); e.execute(runaable2); e.execute(runaable3); e.execute(runaable4); e.e

  • 请帮助我理解newFixedThreadPool(或Cached)的内部流 当我们编写下面的语句时,ExecutorService e=executors.NewFixedThreadPool(3); e.execute(runaable1); e.execute(runaable2); e.execute(runaable3); e.execute(runaable4); e.execute(r

  • 在忽略Java更新一段时间之后,我现在想从我在某处找到的有点阴暗的Java 10.0.2运行时转移到Java 13。事实证明,在Java 8之后,Oracle停止了“单片”JRE哲学,对于我关于如何进行部署的问题,我似乎找不到任何明确的答案。 以下是我认为保持不变的内容: IDE(eclipse)工作流基本保持不变 现在,我无法理解的棘手部分来了:在其他机器上的部署 创建一个module-info

  • 问题内容: 我想了解ES如何在其索引内部存储日期值。可以转换为UTC吗? 我有一个日期类型的字段“ t”。这是映射: 现在,当我向ES插入/添加文档时,它如何存储在索引中。 “ t”:“ 1427700477165”(从Date.now()函数生成的毫秒数)。ES是否在UTC中识别其时代时间并按原样存储? “ t”:“ 2015-03-29T23:59:59”(我会相应地调整映射日期格式)-ES如

  • 我知道Spark可以使用Scala、Python和Java来操作。另外,RDDs用于存储数据。 但是请解释一下,Spark的架构是什么,内部是如何工作的。