很抱歉令人困惑的标题,我不知道如何用简单的词语来描述它,但基本上我要做的是从方法返回一个LinkedList。但我想将实际内容放在Thread内部的方法中,然后在线程完成时返回数据。这是我正在使用的代码:
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,因为它不等待Thread完成。在返回LinkedList之前,我怎么能等到Thread完成?任何帮助将不胜感激。感谢。
注意:问题与读取URL没有任何关系,问题是它返回一个空的LinkedList,因为Thread还没有完成,我想知道如何等到Thread完成才返回东西。
答案 0 :(得分:1)
您需要等到线程完成执行。查看Thread.join
上的文档。
这只是一种做你正在尝试的方法。还有很多其他内容,例如ExecutorService
答案 1 :(得分: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
。< / p>