1

私は聖書のテキスト検索プログラムを書いています。スレッドを使用して作業を分割し、実行時間を短縮したいと考えています。私はJavaでのプログラミングにはある程度慣れていますが、「スレッド」全体についてはまったくの初心者です。基本的に、プログラムは聖書の別々の本を取り出し、テキストを読み、単語を検索し、次の本を取り出します。これを分割して、4 ~ 8 個のスレッドが別々の本で同時に動作するようにします。

何か援助はありますか?

public static void main(String args[]){

    String wordToSearch = "";
    String[] booksOfBible;
    int bookPosition = 0;
    ArrayList<String> finalList = new ArrayList<String>();

    getWord gW = new getWord();
    getBook gB = new getBook();
    checkBook cB = new checkBook();
    wordToSearch = gW.getWord(wordToSearch);
    booksOfBible = gB.getFileList();
    //System.out.println(wordToSearch);
    for(int i = 0; i < booksOfBible.length; i++){
        //System.out.println(booksOfBible[i]);//Test to see if books are in order
        String[] verses = gB.getNextBook(booksOfBible, bookPosition);
        //System.out.println(verses[0]);//Test to see if the books are being read properly
        cB.checkForWord(wordToSearch, verses, booksOfBible[i], finalList);
        bookPosition++;
    }
    for(int i = 0; i < finalList.size(); i++){
        System.out.println(finalList.get(i));
    }
    System.out.println("Word found " + finalList.size() + " times");
}
4

2 に答える 2

0

Runnableメソッド内でテキスト検索を実装および実装するクラスを作成できますrun()

これは、コンストラクター引数として Runnable オブジェクトを使用して新しい Thread オブジェクトを作成することにより、新しいスレッドで実行可能になります。

Thread t = new Thread(myRunnableObj);
t.start();

おそらく、複数のワーカー スレッドが結果を格納するためのデータ構造も必要になるでしょう。スレッドセーフ/同期データ構造を使用していることを確認してください

ただし、Andrew Thompson が指摘したように、聖書全体をインデックス化する方が速い場合があります (例: MySql 全文検索または他のライブラリを使用) 。

于 2013-04-15T00:25:38.200 に答える
0

Executors.newFixedThreadPool(nbNeededThreads) を使用すると ExecutorService インスタンスが得られ、これにより並列タスクを送信できます。「未来」のリストを取得したら、それらを監視して、いつすべてが完了したかを知ることができます。

ExecutorService service = Executors.newFixedThreadPool(4);
ArrayList<Future> queue = new ArrayList<>();

for(int i = 0; i < booksOfBible.length; i++){
    Futur futurTask = service.submit(searchingTask);
    queue.add(futurTask);
}

// TODO Monitor queue to wait until all finished.
于 2013-04-15T00:29:57.580 に答える