2014-01-07 2 views
0

Я использую FixedThreadPool в Java для обработки изображений. Проблема в том, что у меня есть, что в первую очередь я разбираю xml, с информацией об этом xml. Я запускаю потоки в пуле (для загрузки материала).using fixedthreadpool java как проверить, закончен ли

Проблема в том, что я заполняю ThreadPool информацией после каждого тега <> в xml. Поэтому для начала я не знаю, сколько раз мне придется добавлять потоки в пул. например:

XML:

<object> 
<download></download> 
<download></download> 
<download></download> 
</object> 

<object> 
<download></download> 
<download></download> 
</object> 

Я создаю ArrayList с информацией загрузки, и чем передать его ThreadPool.

Threadpool выглядит следующим образом:

public void addAnhang(ArrayList<Anhang> a, String intern_id){ 

    this.generateFolder(intern_id); 


    for(Anhang anh:a){ 
     anh.setZielordner(props.getProperty("zielordner_anhang")+intern_id+File.separator); 

     this.tasks.add(Executors.callable(new AnhangWorker(anh))); 
     //this.pool.execute(new AnhangWorker(anh)); 
    } 

    try { 
     this.pool.invokeAll(tasks); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("end of this cycle"); 
} 

Так что теперь мой вопрос. КАК я знаю, когда все мои потоки закончены? Парсер xml быстрее, чем загрузки, поэтому я не могу убить все потоки после завершения xml. Но я не знаю, когда threadpool выполняется с загрузкой всех файлов.

+0

хорошо, но какие параметры мне нужно в awaitTermination (это может быть, что ThreadPool нужно 5 минут больше, что XML-парсер) –

+0

я пытался что-то вроде этого: времени (this.poool.awaitTermination (10, TimeUnit .SECONDS)) System.out.println («пул все еще работает»); Но он также не закрывается после того, как потоки закончены. –

+0

Это должно работать, но не нужно зацикливать, если вам не нужно что-то делать в цикле. – Gray

ответ

0

КАК Я знаю, когда все мои потоки закончены? Парсер xml быстрее, чем загрузки, поэтому я не могу убить все потоки после завершения xml. Но я не знаю, когда threadpool выполняется с загрузкой всех файлов.

Если в вашем посте Threadpool является ExecutorService то вы должны вызвать this.pool.shutdown(); на него после того, как вы представили все работы в бассейне. Затем вы можете позвонить this.pool.awaitTermination(...);, чтобы дождаться завершения задач.

Если вы хотите подождать вечно, то сделайте что-нибудь наподобие this.pool.awaitTermination(Long.MAX_LONG, TimeUnit.MILLISECONDS);.

Смежные вопросы