0

在详细介绍之前,我想说我已经使用线程进行了所有工作。我想使用 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();
        }
    }

在 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 个文件)吗?

4

1 回答 1

1

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

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

您应该改为将您的小类RunnableCallable类提交到ExecutorService线程池。也许提交给的“任务”ExecutorServiceMessageSendRecieve?很难从您的代码中分辨出来。

例如,他是一个简单的小作业类,我用它作为示例:

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()依次调用它们。

您可能想阅读关于和朋友的文档ExecutorService

于 2013-07-23T17:06:44.583 回答