【问题标题】:Converting serial program to parallel using threads in java?使用java中的线程将串行程序转换为并行程序?
【发布时间】:2013-04-07 00:25:24
【问题描述】:

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

【问题讨论】:

  • 通过制作文本的“字典”可以实现更快的搜索。在这件事上抛出额外的线索不太可能有帮助。
  • “有什么帮助吗?” 有任何(具体)问题吗?
  • 在深入研究多线程之前阅读一些教程是个好主意,例如this one。并行编程非常困难,单线程编程的经验并不能真正让你做好准备。
  • 我和安德鲁一起做这个。使用更好的数据结构而不是额外的资源可以更好地解决一些问题。我认为这是其中之一;建立索引以避免进行暴力搜索。 如果,在构建高性能索引后,仍然需要它更快,那么并行可能会有所帮助。 (我怀疑它会有多大帮助;人们已经展示了对比圣经大得多的事物的极快搜索)。 [旁注:使用严格编码的机器代码对圣经大小的文本缓冲区进行暴力搜索可能会以每秒千兆字节的速度进行搜索;这还不够快?]

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


【解决方案1】:

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

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

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

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

然而,正如 Andrew Thompson 指出的那样,索引整本圣经可能会更快(例如:using MySql fulltext searching 或其他库)

【讨论】:

    【解决方案2】:

    使用 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.
    

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多