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

我对Java和线程编程非常陌生。这段代码大部分出自一本非常古老的书(2001),其中有搜索引擎的示例和示例。 但它只是不起作用 现在我不知道我是否犯了错误,或者作者是否犯了错误,或者是否与不同版本的java不兼容……我真的没有任何线索!最奇怪的是,它能工作100次中的1次。。。 经过数小时的调试,我将感谢任何帮助

SearchEngine.java:

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);
}