ArrayList
JSoup (とりわけ) を使用して、Web ページのタイトルを取得するためにストックされた 600 以上のリンクをプログラムに提供します。リンクごとに ( 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 は、スレッドを作成して start()-join() を作成する代わりに、ExecutorService を使用することを提案したので、次のことを試しました。
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();
ただし、デバッグ リンクのみが出力されます。なぜそれが私のプロセスを実行しないのか考えていますか?