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

2 に答える 2

1

スレッドの実行が完了するまで待つ必要があります。でドキュメントを参照してくださいThread.join

これは、あなたが試みていることを行うための 1 つの方法にすぎません。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それ以外の場合、2 つのスレッドがメモリ同期なしでオブジェクトにアクセスしています。戻るjoin()にスレッドで呼び出している可能性があるため、同期されるため、これは問題ではありません。しかし、そこでの影響を理解することが重要です。join()

最後に、thread.stop()非推奨です。スレッドを中断する正しい方法は、スレッドthread.interrupt()に割り込みフラグを設定し、、、およびその他のメソッドをスローさせるThread.sleep()を呼び出すことです。wait()InterruptedException

于 2012-07-19T13:40:34.543 に答える