我使用 JSoup(以及其他)为我的程序提供了超过 600 个链接,ArrayList
以获取网页的标题。对于每个链接(使用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();
但它只打印我的调试链接。知道为什么它不运行我的进程吗?