在我详细介绍之前,我想说我的一切都在使用线程。我想使用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个文件)?
答案 0 :(得分:1)
executor.execute(new RecieveThread(threadCounter.toString()));
不,这不是ExecutorService
类的工作方式。您正在提交一个线程,就好像它是Runnable
一样。所以你最终得到的Thread
类实际上不是一个线程。池线程只是调用RecieveThread.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()
。