2013-04-25 4 views
2

В настоящее время я пытаюсь использовать многопоточную предыдущую мою программу. Вот приведенный ниже код:Функция Runnable run() немедленно прекращается

public class DipoleTester { 
    public static String DIR = "/home/"; 
    public static void main(String[] args) throws InterruptedException { 
    Dipole trial; 
    ExecutorService service = 
     Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
    for (int r = 10; r < 150; r += 1) { 
     double radius = (double) r/10000.0; 
     for (int matType = 0; matType < 3; matType++) { 
     String name = matType + "_rad" + radius; 
     trial = new DipoleSimple(DIR, name); 
     trial.materialType = matType; 
     trial.RADIUS = radius; 
     service.submit(trial); 
     } 
    } 
    service.shutdown(); 
    service.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS); 
    } 
} 

Это довольно простая программа. run() - довольно простой базовый метод, который раньше использовался как метод main(). В среднем для оценки требуется около 3 минут. Проблема в том, что здесь кажется, что он просто выполняет асинхронный вызов для выполнения(), потому что он мгновенно оценивает весь поток.

i.e. Я ожидаю, что он запустит сканирование 8 потоков параллельно через 3-5 минут. Но вместо этого он запускает каждый и говорит, что он завершен практически мгновенно и загружает следующий поток в threadpool. Поэтому у меня осталось несколько сотен потоков, которые все пытаются запустить одновременно.

Любая идея, что происходит?

+0

Я думаю, что это поможет наблюдать за поведением нити с помощью какого-то инструмента, такого как JVisualVM. Может быть, свалка? и, вероятно, было бы полезно увидеть метод run(). – jambriz

+1

Вы попробовали представить манекен вместо этого? Просто с Thread.sleep (когда-нибудь) в нем? – Fildor

+1

Итак, ваш метод 'DipoleSimple.run()' занимает 3 минуты для оценки? Вы уверены, что что-то еще не происходит, потому что код выглядит хорошо. Можете ли вы опубликовать образец класса DipoleSimple? – Gray

ответ

0

Ваш код выглядит хорошо, я попытался следующий образец, чтобы проверить это:

System.out.println("Available Processors: "+Runtime.getRuntime().availableProcessors()); 
     ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
     final AtomicInteger ai = new AtomicInteger(); 
     for(int i=0; i<10; i++) { 
      es.submit(new Runnable() { 
       public void run() { 
        System.out.println(Thread.currentThread().getName()+"_"+ai.incrementAndGet()); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
     System.out.println("shutting down"); 
     es.shutdown(); 
     System.out.println("shutdown"); 
     es.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS); 
     System.out.println("Completed"); 

Пример вывода (рассмотрим 4 доступный процессор):

Available Processors: 4 
pool-1-thread-2_1 
pool-1-thread-3_3 
pool-1-thread-4_4 
pool-1-thread-1_2 
shutting down 
shutdown 
pool-1-thread-2_5 
pool-1-thread-4_6 
pool-1-thread-3_7 
pool-1-thread-1_8 
pool-1-thread-2_9 
pool-1-thread-4_10 
Completed 

Поскольку вы не предоставления дополнительных испытаний после shutdown , все представленные испытания должны быть обработаны, так как вы можете видеть выше всех 10 потоков, представленных до shutdown. Вы можете проверить это, выполнив регистрацию журнала регистрации run. Далее было бы полезно проанализировать, можете ли вы добавлять журналы времени как сколько времени при запуске вашего фактического кода принимает метод run.

+1

'shutdown' не прерывает выполняемые потоки. – jtahlborn

+0

@jtahlborn благодарит за это, вы правы, прерывание происходит для любых рабочих потоков, которые могут быть заблокированы в 'getTask' внутренне в соответствии с внутренними комментариями в' ThreadPoolExecutor.shutdown'. Отредактировал мой ответ. – harsh

+1

shutdown останавливает любые дополнительные задачи, которые необходимо отправить. Все поставленные задачи будут выполняться. – Gray

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