Я даю своей программе более 600 ссылок, хранящихся в ArrayList
, чтобы получить заголовок веб-страницы, используя JSoup (среди прочего). Для каждой ссылки (используя цикл for) я создаю новый поток (используя thread.start()
) и передаю ссылку через свою программу, я жду завершения моего потока (с thread.join
) перед запуском нового потока (одновременное выполнение вызовет некоторые проблемы, я сделал это, чтобы предотвратить неожиданное завершение потока, чтобы остановить выполнение для других ссылок).
Проблема в том, что иногда JSoup выдает исключение SocketTimeoutException (которое я должен поймать), из-за чего моя программа зависает. Я не знаю, почему выполнение останавливается даже в окружении try/catch
.
Вот кусок моего кода, возможно, это поможет вам понять:
// In the method actionPerformed() of my JPanel
for(final String link : links)
{
Thread t = new Thread()
{
public void run()
{
Analyzer.process(link);
}
};
t.start();
try
{
t.join();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
И в моем процессе:
// method process() of my Analyzer class
try
{
Document doc = Jsoup.connect(lien).userAgent("Mozilla").timeout(5*10000).get();
// ^ EXCEPTION THROWN HERE ! ^
title = doc.title();
}
catch (Exception e)
{
e.printStackTrace();
erreurs+="Erreur lors de la lecture du titre\n";
}
Это раздражает, потому что процесс очень долгий, я оставил его работать на ночь и сегодня обнаружил, что моя программа зависла на 54-й ссылке. ^^' Заранее спасибо!
ИЗМЕНИТЬ – ОБНОВИТЬ
SercanOzdemir предложил мне использовать ExecutorService вместо создания потоков и выполнения start()-join(), поэтому я попробовал:
ExecutorService ex = Executors.newSingleThreadExecutor();
for(final String link : links)
{
System.err.println("-- "+i+" --"); //DEBUG
ex.execute(new Runnable(){
@Override
public void run(){
try
{
Analyzer.process(link);
}
catch( Exception e )
{
e.printStackTrace();
}
}
});
i++; //DEBUG
}
ex.shutdown();
Но он печатает только мои отладочные ссылки. Любая идея, почему он не запускает мой процесс?
join()
егоjoin()
не делать в промежутке? А. Нет. - person user207421   schedule 29.04.2015