2012-07-19 90 views
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,因为线程还没有完成,我想知道如何等待线程完成之前返回一些东西

+4

为什么你要把它放在一个单独的线程,如果你想等待它返回? – gobernador 2012-07-19 01:39:50

+0

线程的要点是并行处理。如果第一个线程要等待第二个线程完成,那么没有必要启动第二个线程。不妨在第一个线程上完成这项工作。 – Wyzard 2012-07-19 01:43:07

+0

['Thread.stop()'](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#stop%28%29)已弃用。请参阅[为什么Thread.stop,Thread.suspend和Thread.resume已弃用?](http://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html) – 2012-07-19 01:43:31

回答

1

您需要等待线程完成执行。查阅关于Thread.join的文档。

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

+0

好吧我在网上查了一个例子,好像你在启动线程后立即调用Thread.join。所以在我启动线程之后,我在下面的一行中添加了一个Thread.join。 编辑:所以它的工作,但它仍然有点缓慢。当我调用这种方法时,我有点期待没有滞后,因为每次用户在文本框中输入不同的东西时,我基本都会调用此方法。 – 2012-07-19 01:42:58

+0

但是,这也可能是由于这实际上是Android开发的事实,所以我有点不确定是否因为我的模拟器缺少RAM,但是谢谢。 – 2012-07-19 01:46:24

+0

你可能也对[Callable/Future]感兴趣(https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6) – Pshemo 2012-07-19 01:47:18

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(),它在线程上设置中断标志并导致Thread.sleep()wait()和其他一些方法抛出InterruptedException