4

ファイルから一連の行を検索し、特定の部分文字列を見つけようとするプログラムを作成する必要があります。見つかった場合は、その行を出力します。読み取った各行はスレッドとして作成され、各スレッドはファイルの 1 行を検索します。それは今のところ問題ではありません。プログラムで実行する必要があるのは、スレッドが作成されたのと同じ順序で最終結果 (テキスト行) を出力することです。IE スレッド 6 は、スレッド 2 の前に印刷すべきではありません。スレッドが同時に実行されても問題ありません。印刷順序を維持する必要があります。次のメソッドを開始する前にもう一方のメソッドが完全に終了するのを待ちたくないので、結合メソッドを使用できません。それらを同時に実行したいのです。これを行うことに関する提案はありますか?また、ファイルには任意の行数を含めることができるため、スレッド数をハードコードすることはできません。

スレッドは独自の印刷を行う必要があります。メインは印刷を行いません。

4

4 に答える 4

8

まず第一に、スレッド化されたアプリケーションの順序を定義するのは困難です。ここを参照してください:マルチスレッドでの不要な出力

特定の順序で出力が必要な場合は、おそらくExecutorServiceを返す を使用する必要がありFutureます。Callable<String>結果を返すそれぞれのサービスにクラスを送信します。送信は を返しますFuture<String>。その後、ジョブをサービスに送信したのと同じ順序でget()から呼び出すことができます。Future

// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// or you can create an open-ended thread pool
// ExecutorService threadPool = Executors.newCachedThreadPool();
// define your jobs somehow as a Callable that returns the line (prolly a string)
List<Future<String>> futures = threadPool.invokeAll(jobsToDo);
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
// now we can go through the futures and get the results in order
for (Future<String> future : futures) {
    // this returns the results from the `call()` in order or it throws
    String resultFromCall = future.get();
}

ジョブCallableクラスは次のようになります。

public class MyCallable implements Callable<String> {
    private String input;
    public MyCallable(String input) {
        this.input = input;
    }
    public String call() {
        // search the input string
        String result = search(input);
        return result;
    }
}
于 2013-09-20T21:40:31.047 に答える
1

次のメソッドが他のメソッドが完全に終了するまで待機してから開始したくないため、結合メソッドを使用できません。同時に実行したいのです。

それらに配列を設定させ(初期状態の一部として、それぞれが最初に設定する要素を「知っている」)、すべてのスレッドに参加して、すべてが終了するのを待ってから、単に印刷することができます配列の内容を順番に取り出します。

于 2013-09-20T21:37:47.180 に答える