Какие условия могут привести к неожиданному возвращению потока Java? - PullRequest
3 голосов
/ 13 февраля 2012

Эта проблема возникла в распределенном многопоточном приложении, которое я разрабатываю, где потоки могут случайно возвращаться во время выполнения распределенной задачи.Предположим, что каждый поток в этом приложении использует тот же базовый код, что и в приведенном ниже блоке:

public class ExecutionThread extends Thread{
    @Override
    public void run(){
        while(true){
            try{
                //task submitter app dumps all Tasks in to a queue.  We retrieve
                //those tasks here one-by-one and run them:
                Task t = priorityBlockingQueue.take();

                //execute is abstract, so it could potentially do anything here:
                t.execute(); 
            } catch(Throwable e){
                //task submitter app will be able to access the Throwable later:
                t.setUncaughtThrowable(e); 
            }
        }
    }
}

Следует отметить, что класс Task является абстрактным и очень упрощенным - он имеет только метод execute (), который является абстрактнымпоэтому я не чувствовал необходимости размещать здесь код для этого.

Я знаю, что в JVM могут происходить какие-то безумные вещи, но этот код мне кажется довольно пуленепробиваемым, поскольку поток никогда не долженвернитесь, если JVM не будет запущена.На самом деле, мы видим, что потоки по-прежнему возвращают , а их соответствующие JVM не умирают и не могут определить причину.Что еще хуже, мы не можем видеть консоль для этих потоков, потому что они создаются как дочерние процессы на удаленных машинах.Мы попытались записать бросаемый объект, но ничего не печатается в файл.Любые идеи о том, что может привести к возвращению этой темы?

1 Ответ

4 голосов
/ 13 февраля 2012

В предложении catch должно быть Exception.

...