Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > ThreadPoolExecutor не работает


Автор: DenisT 2.10.2009, 12:57
Написал небольшую программу чтобы поэкспериментировать с пулом потоков.

Код


import java.util.concurrent.*;

public class Main 
{
    public static void main(String[] args) 
    {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Task t = new Task();
        pool.submit(t);                
        pool.shutdownNow();
    }        




Код

import java.util.concurrent.Callable;

public    class Task implements Callable<Integer>
{
    @Override
    public Integer call()
    {
        while(true){}
    }
}


Заметил, что при завершении работы программы и выхода потока из метода main поток в пуле продолжает работать!
Подскажите, в чем может быть ошибка?

Автор: LSD 2.10.2009, 13:05
Цитата(DenisT @  2.10.2009,  12:57 Найти цитируемый пост)
Подскажите, в чем может быть ошибка? 

Дело в том, что http://forum.vingrad.ru/users/DenisT не читает книг по Java. JVM завершает свою работу когда не остается ни одного работающего потока не демона. А завершился ли main() или нет ей плевать. Более того можно у апплетов main() вообще нет.

Автор: DenisT 2.10.2009, 13:15
Скорее дело в том, что http://forum.vingrad.ru/users/LSD никогда раньше не работал с пулом потоков и запустить мой код тоже не потрудился.

это не объясняет, почему не отрабатывает метод pool.shutdownNow(); не завершает потоки в пуле. Я даже исходники смотрел, реализация данного метода - цикл по всем потокам пула и вызов для каждого метода interrupt()

Есть еще идеи?


Автор: LSD 2.10.2009, 13:22
Цитата(DenisT @  2.10.2009,  13:15 Найти цитируемый пост)
Скорее дело в том, что кое-кто никогда раньше не работал с пулом потоков и запустить мой код тоже не потрудился.

Код действительно не запускал, а вот с потоками и пулами работал достаточно.



Цитата(DenisT @  2.10.2009,  13:15 Найти цитируемый пост)
это не объясняет, почему не отрабатывает метод pool.shutdownNow(); не завершает потоки в пуле. Я даже исходники смотрел, реализация данного метода - цикл по всем потокам пула и вызов для каждого метода interrupt()

Осталось только прочитать что именно делает метод interrupt() и соотнести его с кодом Task, чтобы понять что самому таску на все эти интерапты глубоко пофиг. Ты где нибудь внутри цикла проверяешь статус? smile 

Автор: LSD 2.10.2009, 15:03
Код

public class Test
{
  public static void main(String[] args) throws Exception
  {
    final int availableProcessors = Runtime.getRuntime().availableProcessors();
    ExecutorService pool = Executors.newFixedThreadPool(availableProcessors);
    for(int i = 0; i < availableProcessors; i++)
    {
      pool.submit(new Task());
    }
    Thread.sleep(10000);
    pool.shutdownNow();
  }

  public static class Task implements Callable<Integer>
  {
    public Integer call()
    {
      Thread currentThread = Thread.currentThread();
      while(!currentThread.isInterrupted())
      {
      }
      return 0;
    }
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)