0

很抱歉标题令人困惑,我不知道如何用最少的词来描述它,但基本上我想要做的是从一个方法返回一个 LinkedList。但我想将实际内容放在线程内的方法中,然后在线程完成时返回数据。这是我正在使用的代码:

public static LinkedList<Result> get(final String prefix){
    final LinkedList<Result> results = new LinkedList<Result>();
    if(thread != null){
        thread.stop();
        thread = null;
    }
    thread = new Thread(
            new Runnable(){
                public void run(){
                    try{
                        URL url = new URL(String.format(URL_INFO, prefix));
                        URLConnection connection = url.openConnection();
                        connection.setReadTimeout(Timeout.TIMEOUT);
                        connection.setConnectTimeout(Timeout.TIMEOUT);
                        InputStream is = connection.getInputStream();
                        Scanner reader = new Scanner(is);
                        while(reader.hasNextLine()){
                            String line = reader.nextLine();
                            if(line != null){
                                if(line.contains(String.format(WORDS_INFO, prefix))){
                                    String[] s = line.split(String.format(PREFIX_INFO, prefix));
                                    String[] s2 = s[1].split("\">");
                                    if(s2.length > 0){
                                        for(int i = 1; i < s2.length; i++){
                                            String l = s2[i];
                                            String[] split = l.split(FINAL_SPLIT);
                                            results.add(new Result(prefix, split[0].trim()));
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                        reader.close();
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
    );
    thread.start();
    return results;
}

线程是在变量部分中静态定义的。基本上这里的问题是它返回一个空的 LinkedList 因为它没有等待线程完成。如何等到线程完成后再返回 LinkedList?任何帮助将不胜感激。谢谢。

注意:这个问题与读取 URL 无关,问题是它返回一个空的 LinkedList,因为 Thread 尚未完成,我想知道如何等到 Thread 完成后再返回一些东西。

4

2 回答 2

1

您需要等到线程完成执行。在 上查找文档Thread.join

这只是做你正在尝试的事情的一种方法。还有很多其他的,比如ExecutorService

于 2012-07-19T01:39:33.957 回答
1

我不确定你为什么在这里使用线程。如果您必须分叉线程然后等待它完成,那么您应该run()直接在父线程中执行代码。

同样重要的是要意识到,当您执行以下操作时:

final LinkedList<Result> results = new LinkedList<Result>();
thread = new Thread(
        new Runnable(){
            public void run(){
                ...
                results.add(new Result(prefix, split[0].trim()));
...
return results;

您正在results以非线程安全的方式使用该对象。 results不是同步集合,因此Runnable如果您确实想在线程仍在运行时返回它,则需要在外部线程和外部线程中对其进行同步。否则,两个线程在没有内存同步的情况下访问对象。由于您现在可能在返回之前join()调用线程,因此这将不是问题,因为将为您同步。但重要的是要意识到那里的后果。join()

最后,thread.stop()被弃用。中断线程的正确方法是调用thread.interrupt()which 在线程上设置中断标志并导致Thread.sleep(),wait()和其他一些方法抛出InterruptedException

于 2012-07-19T13:40:34.543 回答