如何配置ThreadPoolExecutor以限制线程数

时间:2013-07-23 17:03:22

标签: java multithreading threadpoolexecutor

在我详细介绍之前,我想说我的一切都在使用线程。我想使用ThreadPoolExecutor。我无法理解ThreadPoolExecutor在我的情况下是如何工作的。

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

我启动了4个侦听startDocument方法中队列的线程。

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();
        }
    }

和endElement方法

 public void endElement( String namespaceURI, String localName, String qName ) throws SAXException
    {

        if( PRODUCT.equals( localName ) )
        {
            totalProducts++;
            productXML.append( NODEENDSTARTTAG ).append( localName ).append( NODEEND );
           messageSendRecieve.putMessage( productXML.toString() );
        }
}

在接收方,我的4个线程中的每一个都创建一个新文件,侦听队列,进行一些处理,最后将输出写入它。最后,我的主线程将所有4个输出文件合并为1个文件。

我想使用ThreadPoolExecutor转换此过程,我在互联网和我看到的任何地方都看过示例

executor.execute(new RecieveThread(threadCounter.toString()));

我的问题是ThreadPoolExecutor如何适合我的情况?如果我有一个包含1000个产品的xml文件,ThreadPoolExecutor会创建1000个线程吗?每个线程创建一个输出文件(1000个文件)?

1 个答案:

答案 0 :(得分:1)

  

executor.execute(new RecieveThread(threadCounter.toString()));

不,这不是ExecutorService类的工作方式。您正在提交一个线程,就好像它是Runnable一样。所以你最终得到的Thread类实际上不是一个线程。池线程只是调用RecieveThread.run()方法。

您应该将小RunnableCallable类提交到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()

您可能需要阅读docs about ExecutorService and friends