Я передаю свою программу более чем 600 ссылкам, хранящейся в ArrayList
, чтобы получить название веб-страницы, используя JSoup (среди прочих). Для каждой ссылки (используя для цикла) я создаю новый поток (используя thread.start()
) и передаю ссылку через мою программу, я жду, пока мой поток завершится (с thread.join
) перед запуском нового потока (одновременное выполнение вызовет некоторые проблемы, я сделал это, чтобы предотвратить неожиданный конец потока, чтобы остановить выполнение для других ссылок).Почему SocketTimeoutException заставляет мою программу замерзать?
Проблема в том, что иногда 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-й ссылке. ^^ 'Спасибо заранее!
EDIT - ОБНОВЛЕНИЕ
SercanOzdemir предложил мне использовать ExecutorService, вместо того чтобы создавать темы и сделать старт() - 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()», не делая ничего другого между ними? А. Нет. – EJP
@EJP Если я использую только один поток для выполнения моего процесса на 600 ссылках, единственное прерывание потока остановит весь процесс (у меня уже была эта проблема), и если я не буду выполнять каждый процесс один за другим, У меня другая проблема (особенно для обработки некоторых файлов). Я понимаю, что вы думаете, но это был единственный способ найти проблему с моими знаниями. :) – Malik