Java 为什么我的线程没有结束?
我对Java和线程编程非常陌生。这段代码大部分出自一本非常古老的书(2001),其中有搜索引擎的示例和示例。 但它只是不起作用 现在我不知道我是否犯了错误,或者作者是否犯了错误,或者是否与不同版本的java不兼容……我真的没有任何线索!最奇怪的是,它能工作100次中的1次。。。 经过数小时的调试,我将感谢任何帮助 SearchEngine.java:Java 为什么我的线程没有结束?,java,multithreading,search-engine,Java,Multithreading,Search Engine,我对Java和线程编程非常陌生。这段代码大部分出自一本非常古老的书(2001),其中有搜索引擎的示例和示例。 但它只是不起作用 现在我不知道我是否犯了错误,或者作者是否犯了错误,或者是否与不同版本的java不兼容……我真的没有任何线索!最奇怪的是,它能工作100次中的1次。。。 经过数小时的调试,我将感谢任何帮助 SearchEngine.java: import java.util.Vector; import parsing.SourceElement; import parsing.Web
import java.util.Vector;
import parsing.SourceElement;
import parsing.WebParserWrapper;
import query.Filter;
public class SearchEngine implements Runnable {
private Vector linkHistory = new Vector();
private int currentLink;
private String beginAt = null;
private SearchHandler searchHandler = null;
private boolean searchInProgress = false;
private boolean stopPending = false;
boolean firstTime = true;
public boolean searchInProgress() {
return searchInProgress;
}
public boolean stopPending() {
return stopPending;
}
@SuppressWarnings("unchecked")
public void followLinks(String url) {
if (stopPending)
return;
try {
boolean drillDown = false;
WebParserWrapper webParser = new WebParserWrapper();
Vector sortedElements = webParser.getElements(url, "", "WITHGET");
Vector contentElements = Filter.getFilteredElements(sortedElements, Filter.CONTENT, "matches", "*");
for (int i = 0; i < contentElements.size(); i++) {
SourceElement thisElement = (SourceElement) contentElements.elementAt(i);
String thisKey = (String) thisElement.getKey();
String thisContent = (String) thisElement.getContent();
boolean goodHit = searchHandler.handleElement(url, thisKey, thisContent);
if (goodHit) {
drillDown = true;
}
}
System.out.println(url + " -- DrillDown " + ((drillDown) ? "positive" : "negative"));
if (drillDown) {
Vector linkElements = Filter.getFilteredElements(sortedElements, Filter.KEY, "matches",
"*a[*].@href[*]");
for (int i = 0; i < linkElements.size(); i++) {
SourceElement thisElement = (SourceElement) linkElements.elementAt(i);
String thisContent = (String) thisElement.getContent();
if (!linkHistory.contains(thisContent)) {
linkHistory.add(thisContent);
System.out.println("Collected: " + thisContent);
}
}
}
}
catch (Exception e) {}
if (currentLink < linkHistory.size()) {
String nextLink = (String) linkHistory.elementAt(currentLink++);
if (nextLink != null) {
followLinks(nextLink);
}
}
}
public boolean startSearch(String url, SearchHandler searchHandler) {
if (searchInProgress)
return false;
beginAt = url;
this.searchHandler = searchHandler;
this.linkHistory = new Vector();
this.currentLink = 0;
Thread searchThread = new Thread(this);
searchThread.start();
return true;
}
public void stopSearch() {
stopPending = true;
}
@Override
public void run() {
searchInProgress = true;
followLinks(beginAt);
searchInProgress = false;
stopPending = false;
}
}
SearchHandler.java
public interface SearchHandler {
public boolean handleElement(String url, String key, String content);
}
stopPending
可能应该volatile
或AtomicBoolean
-这同样适用于searchInProgress
…while(searchEngine.searchInProgress())代码>可能相当昂贵,应避免使用。相反,你应该使用某种类型的锁,并简单地等待它……你可能想要通读更多的想法,你也不应该只是吞下一个异常。至少,打印堆栈跟踪。哇,2001。那是很久以前的事了。自从那本书出版以来,Java发生了很大的变化。多核机器通常是可用的,JIT编译器要好得多,所以像这样的代码在2001年可能“起作用”,现在在2015年就失败了。语言和库也发生了很大的变化。没有仿制药<代码>矢量
<代码>哈希表<代码>枚举?我强烈建议你买一本更新的书来学习;这个会教你很多坏东西。
public interface SearchHandler {
public boolean handleElement(String url, String key, String content);
}