當下載第一個URL時(一般是網站主頁),如果等待時間過長,那么其他線程要么會認為網站已下載完而結束,要么會在下面標*代碼處拋出
NullPointerException, 很少能夠存活下來。
else if(queueSize() == 0) /* queueSize()已經被同步 */
{
break;
}
URLToDownload nextURL;
synchronized(queue)
{
nextURL = queue.getNextInQueue();
downloadsInProgress++;
}
synchronized(urlsDownloading)
{
urlsDownloading.add(nextURL);
}
int newDepth = nextURL.getDepth() + 1; **********************
估計可能是線程交叉了,還沒來得及同步就跑到后面去執行getDepth()了。
在
nextURL = queue.getNextInQueue();后面加上判斷就OK了:
synchronized(queue)
{
nextURL = queue.getNextInQueue();
if(nextURL == null)
{
continue;
}
downloadsInProgress++;
}
版權所有 羅明