使用java中的线程将串行程序转换为并行?

时间:2013-04-15 00:18:25

标签: java multithreading parallel-processing full-text-search

我正在为圣经编写一个文本搜索程序,我想使用线程来分割工作,以便缩短执行时间。我熟悉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");
}

2 个答案:

答案 0 :(得分:0)

您可以创建一个实现Runnable的类,并在run()方法中实现文本搜索。

然后通过使用Runnable对象作为构造函数参数创建一个新的Thread对象,可以在新线程中运行

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

据推测,您还需要一个用于多个工作线程的数据结构来存储结果。确保使用线程安全/同步数据结构

然而正如Andrew Thompson指出的那样,你可以更快地索引整本圣经(例如:using MySql fulltext searching或其他图书馆)

答案 1 :(得分: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.