Java 如何配置ThreadPoolExecutor以限制线程数

Java 如何配置ThreadPoolExecutor以限制线程数,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,在我进入细节之前,我想说的是,我已经使用线程完成了所有工作。我想使用ThreadPoolExecutor。我无法理解ThreadPoolExecutor在我的案例中是如何工作的 我有一个xml文件。我编写了解析这个xml文件的代码,当解析器解析预定义的结束元素标记时,我将元素放在队列中 我在startDocument方法中启动4个线程来侦听队列 public void startDocument() { String queueName = getQueueName();

在我进入细节之前,我想说的是,我已经使用线程完成了所有工作。我想使用ThreadPoolExecutor。我无法理解ThreadPoolExecutor在我的案例中是如何工作的

我有一个xml文件。我编写了解析这个xml文件的代码,当解析器解析预定义的结束元素标记时,我将元素放在队列中

我在startDocument方法中启动4个线程来侦听队列

public void startDocument()
    {
        String queueName = getQueueName();
        messageSendRecieve = new MessageSendRecieve( queueName );
        int maxProcessorThreads = 4;
        recieveThread = new RecieveThread[maxProcessorThreads];
        for( int i = 0; i < maxProcessorThreads; i++ )
        {
            recieveThread[i] = new recieveThread ( queueName,new String( "" + ( i + 1 ) ),                                                                   outputFileName,
                                                                          jobId );
        recieveThread[i].start();
        }
    }
在接收端,我的4个线程中的每一个都创建一个新文件,侦听队列,进行一些处理,最后将输出写入队列。最后,我的主线程将把所有4个输出文件合并成一个文件

我想使用ThreadPoolExecutor转换这个过程,我浏览了internet和我所看到的任何地方的示例

executor.execute(new RecieveThread(threadCounter.toString()));
我的问题是ThreadPool Executor如何适应我的情况?如果我有一个包含1000个产品的xml文件,ThreadPoolExecutor会创建1000个线程,每个线程创建一个输出文件(1000个文件)吗

executor.execute(新接收线程(threadCounter.toString())

不,这不是
ExecutorService
类的工作方式。您正在提交一个线程,就像它是一个可运行的
线程一样。因此,您最终得到了一个实际上不是线程的
线程
类。池线程正在调用
receiveThread.run()
方法

您应该将小型
Runnable
Callable
类提交到
ExecutorService
线程池。提交给
ExecutorService
的“任务”可能是
MessageSendRecieve
?很难从你的代码中分辨出来

例如,他是一个简单的小职业班,我以他为例:

public class MyJob implements Runnable {
    // you can construct your jobs and pass in context for them if necessary
    public MyJob(String someContext) {
        ...
    }
    public void run() {
        // process the small job
    }
}
线程由
ExecutorService
启动,每个线程从内部队列中退出一个作业,并依次对其调用
run()

您可能需要阅读。

请在询问之前阅读。我认为这很好地解释了你的问题。如果没有,请说明您不理解的内容。
public class MyJob implements Runnable {
    // you can construct your jobs and pass in context for them if necessary
    public MyJob(String someContext) {
        ...
    }
    public void run() {
        // process the small job
    }
}