Темы уничтожены? - PullRequest
2 голосов
/ 18 мая 2011

Я создаю пул потоков с Executors.newFixedThreadPool, но через некоторое время я заметил, что некоторые из них перестали отвечать (вызовите этот метод ниже).

Они были уничтожены? Я выполняю синхронизацию, и система продолжает работу, когда все потоки, завершившие задачу, завершаются, но система заходит в тупик.

Они были уничтожены? Что я могу сделать, чтобы предотвратить или справиться с этим?

//this is the method that threads call when finish the work
synchronized void setTaskFinish(){
    System.out.println(Thread.currentThread().getName() + " finishing the work.");        
    finishedThreads++;  
    System.out.println(finishedThreads +" finished the work.");
    if(finishedThreads == numberThreads){            
        finishedThreads = 0;
        this.notify();
    }
}

//this is the method that creates the thread
//I dont know much about this executors yet, so I think it have errors
public void execute(int numberThreads) {    
    for (int i = 0; i < numberThreads; i++) {
        crawlers.add(new SlaveCrawler());
    }

    ExecutorService threadExecutor = Executors.newFixedThreadPool(numberThreads);        

    for (int i = 0, n = crawlers.size(); i < n; i++) {
        threadExecutor.execute((Runnable) crawlers.get(i));
    }      

    threadExecutor.shutdown();        
}

РЕДАКТИРОВАТЬ : Я полностью изменил свою логику. Я не провел много испытаний, но сейчас все выглядит нормально. Может быть, это было что-то не так в моей старой логике.

1 Ответ

1 голос
/ 19 мая 2011

Исполнитель не будет уничтожать потоки, которые заняты выполнением ваших задач.Если вы назначили 60 задач и только 55 «завершено» (точнее, ваш метод setTaskFinish() вызывается только 55 раз), это может быть исключением, преждевременно завершающим вашу задачу.Deadlock - это еще одна возможность, но не первая, которую я бы рассмотрел.

Что происходит, когда ваша задача выдает непроверенное исключение, например RuntimeException?Он вызывает setTaskFinish() из finally блока?Почему вы управляете параллелизмом, используя synchronized вместо AtomicInteger?

...