Java ExecutorService无法按预期工作

时间:2016-09-02 20:12:18

标签: java executorservice

我看了一下JAVA并尝试使用ExecutorService。不幸的是,我的执行者没有启动我的可运行对象。 我正在尝试从不同的XML文件中获取一些信息,这些文件存储在文件列表中。

    FileFinder fileFinder = new FileFinder(path);
    List<File>files = fileFinder.getFiles();

     ExecutorService threadPool = Executors.newFixedThreadPool(configReader.getThreadcount(), new ThreadFactory() {

        @Override
        public Thread newThread(Runnable r) {
            return new EinbucherThread();
        }
    });


     for(File file : files) 
     {
        System.out.println("Started working");
        USEinbucher einbucher = new USEinbucher(file, verbindung);
        threadPool.execute(einbucher);
     }

    threadPool.shutdown();



    try {
        while(!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
            i++;
            System.out.println("waiting "+i );
            ;
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

我认为我可以通过将unmarshaller放入我的线程来提高性能。所以我不需要为每个文件创建一个unmarshaller,但每个线程只需创建一次(据我所知,API可以多次使用每个线程)。

public class EinbucherThread extends Thread {
private Unmarshaller um;
public EinbucherThread() {

    try {
        JAXBContext jb = JAXBContext.newInstance("klassen");
        um = jb.createUnmarshaller();
        System.out.println("Thread was created");
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public Unmarshaller getUm() {

    return um;
}

不幸的是,好像我的runnable类的run方法永远不会到达。

public class USEinbucher implements Runnable {
private File lieferung; 
private Verbindung verbindung;

    public USEinbucher(File lieferung, Verbindung verbindung) {
    this.lieferung=lieferung;       
    this.verbindung=verbindung;

}

@Override
public void run()
{
    System.out.println("Started to work");
    einbuchen();
}

我插入了一些println进行调试。有三个文件和两个threadcount,我的输出看起来像:

开始工作

线程已创建

开始工作

线程已创建

开始工作

线程已创建

等待1

等等2

等等3 ...

任何解释都表示赞赏。

1 个答案:

答案 0 :(得分:2)

ThreadFactory.newThread应返回负责运行参数Thread对象的Runnable。考虑将Runnable参数传递给Thread对象。例如:

@Override
public Thread newThread(Runnable r) {
    return new EinbucherThread(r);
}

//in the constructor of EinbucherThread 
public EinbucherThread (Runnable r){
    super(r);
}