我看了一下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 ...任何解释都表示赞赏。
答案 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);
}