Java 驼峰线程池查询

Java 驼峰线程池查询,java,multithreading,apache-camel,threadpool,Java,Multithreading,Apache Camel,Threadpool,我正在研究驼峰线程池,并使用池大小和最大池大小。我的理解是,每个请求将由一个线程处理,如果请求>池大小,则将使用最大池大小在池中创建新的一个线程。为了确保我的理解,我做了以下POC public class FileMoverRoute extends SpringRouteBuilder { @Override public void configure() throws Exception { CamelContext context = getContex

我正在研究驼峰线程池,并使用池大小和最大池大小。我的理解是,每个请求将由一个线程处理,如果请求>池大小,则将使用最大池大小在池中创建新的一个线程。为了确保我的理解,我做了以下POC

public class FileMoverRoute extends SpringRouteBuilder {

    @Override
    public void configure() throws Exception {
        CamelContext context = getContext();
        ExecutorService executorService = new ThreadPoolBuilder(context)
                .poolSize(1).maxPoolSize(10).maxQueueSize(100).build("CustomThreadPool");

        from("file://C:/from").log("Received ${body}:${threadName}").threads().executorService(executorService)
                .log("Processing ${body}:${threadName}").process(new FileProcessor()).to("file://C:/to");
    }

}

public class FileProcessor implements Processor{

    public void process(Exchange exc) throws Exception {
        Map<String, Object> headerMap = exc.getIn().getHeaders();
        System.out.println(" sleep for minute");
        TimeUnit.MINUTES.sleep(1);
        System.out.println(" woke up"+headerMap);
    }

}
公共类FileMoverRoute扩展了SpringRouteBuilder{
@凌驾
public void configure()引发异常{
CamelContext=getContext();
ExecutorService ExecutorService=新线程池生成器(上下文)
.poolSize(1).maxPoolSize(10).maxQueueSize(100).build(“CustomThreadPool”);
from(“file://C:/from”).log(“已收到${body}:${threadName}”).threads().executorService(executorService)
.log(“处理${body}:${threadName}”).process(新文件处理器()).to(“文件://C:/to”);
}
}
公共类FileProcessor实现处理器{
公共作废进程(Exchange exc)引发异常{
Map headerMap=exc.getIn().getHeaders();
System.out.println(“睡眠一分钟”);
时间单位。分钟。睡眠(1);
System.out.println(“唤醒”+headerMap);
}
}
我在文件处理器里睡了1分钟。若我将文件夹中的1个文件(1.txt)放入其中,我可以在控制台中看到接收和处理日志。如果将下2个文件(2.txt,3.txt)从文件夹中放入。我可以看到收到的2个未处理日志文件的日志。因为我的最大池大小是10,所以camel应该增加线程并选择文件

  • 为什么不在池中创建新线程
  • 为什么没有拾取新文件
  • 如何解决这个问题

  • 由于已将poolsize设置为1,因此将只使用一个线程进行处理

    线程的创建如下

  • 如果线程池小于池大小,将创建一个新线程进行处理

  • 如果作业小于maxQueueSize,则将作业放置在队列上以等待空闲线程

  • 如果队列已满且线程池实例化的线程少于maxPoolSize,则会创建一个新线程来处理作业


  • 您可以通过减少QueueSize来自己测试

    是的,我更改了maxQueueSize(-1)。它正在按预期工作。然后,为新作业创建新线程。总是应该是-1。请确认,或者有什么办法。当所有线程都忙于处理作业时,作业将被排队,这将非常有用。如果有足够数量的线程要处理,可以将队列大小设置为-1,然后将为每个作业创建新作业,直到达到最大池大小。