将params传递给callable是行不通的

时间:2015-06-29 09:30:38

标签: java multithreading

我正在尝试将n个XML转换为n个线程中的n个PDF。为此,我使用ExecutorService并将线程池大小限制为例如10:

File[] files = getDocuments(sourceFolder);

ExecutorService executorService = Executors.newFixedThreadPool(10);

List<Future<Integer>> threads = new ArrayList<>();

for (File source : files) {
    if (logger.isDebugEnabled()) {
        logger.debug("Creating thread for " + source.getName());
    }
    Callable<Integer> callable = new XMLToPDFCallable(source, FileNameUtils.getPdfTarget(source, targetFolder));
    Future<Integer> future = executorService.submit(callable);
    threads.add(future);
}

在我进行第一次测试后,我发现只有一个XML被成功转换,我也看到XMLToPDFCallable()总是使用相同的参数:

  

TransformerExecutorService.startExecution - 为 test_bold.xml 创建线程   TransformerExecutorService.startExecution - 为 test_list_attach.xml创建线程   TransformerExecutorService.startExecution - 为 test_underlined.xml 创建线程   XMLToPDFCallable.call XMLToPDFCallable(文件 test_bold.xml ,文件test_bold.pdf)
  XMLToPDFCallable.call XMLToPDFCallable(文件 test_underlined.xml ,文件test_underlined.pdf)   XMLToPDFCallable.call XMLToPDFCallable(文件 test_underlined.xml ,文件test_underlined.pdf)   XMLToPdf.transform - test_underlined.xml

     

XMLToPdf.transform - test_underlined.xml

     

XMLToPdf.transform - test_underlined.xml

     

XMLParser的。 - XMLParser(文件 test_underlined.xml

     

XMLParser的。 - XMLParser(文件 test_underlined.xml

     

XMLParser的。 - XMLParser(文件 test_underlined.xml

     

FutureTask @ 4c90265b的结果:1   FutureTask的结果@ bc647a2:1   FutureTask的结果@ 688e2b8:1

XMLToPDFCallable类:

public class KMToPDFCallable implements Callable<Integer> {
...
public XMLToPDFCallable(File source, File target) {

    this.source = source;
    this.target = target;
}

@Override
public Integer call() throws Exception {
    logger.debug("call() of Instance XMLToPDFCallable(File " + source.getName() + ", File " + target.getName() + ") ");
    xmlToPdf = new XMLToPdf();
    if(xmlToPdf.transform(source, target)) {
        status = STATUS_FINISHED;
    } else {
        status = STATUS_ABORTED;
    }
    kmToPdf = null;
    return status;
}

XMLToPDF类(简单类):

public boolean transform(File src, File target) {
        ...
        // the XML parser
        logger.debug(src.getName());
        xmlParser = new XMLParser(src);
        ...

XMLParser类(也是简单类):

public XMLParser(File xml) {
        logger.debug("XMLParser(File " + xml.getName() + ")");
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            builder = factory.newDocumentBuilder();
            document = builder.parse(xml);
            builder.reset();
        } catch (ParserConfigurationException e) {

那么为什么XMLToPDFCallable.call总是使用相同的文件而不是我在构造函数中传递的文件?

0 个答案:

没有答案