将代码转换为多线程版本

时间:2011-04-30 19:48:27

标签: java multithreading

我有以下问题:

  • 例如,我有10个列表,每个列表都有一个链接到其他一些列表,我想创建一个代码来搜索这些列表中的元素,我已经完成了这个算法但是按顺序,它开始搜索第一个列表,然后如果搜索失败,它会发送消息以便在与其有链接的列表中搜索(到第一个),在算法结束时,他将结果显示为访问的列表数量,如果他找到了元素或没有。
  • 现在,我想将它转换为并行算法,至少是使用多线程的并发算法:
    • 使用线程进行搜索;
    • 同时开始在10个列表中搜索;

2 个答案:

答案 0 :(得分:1)

只要您不做任何更改,您就可以将搜索视为只读。在这种情况下,您可能不需要同步。如果您想快速搜索,请不要直接使用线程,而是使用runnables并查找相应的类。如果直接使用线程,请确保不要超过处理器数量。

在进一步研究之前,请阅读多线程。我会提到“Java Concurrency in Practice”作为(相当安全的)推荐。这很容易出错。

答案 1 :(得分:0)

我不确定您的问题陈述是否在不同列表中的搜索之间存在顺序依赖关系,即第一个列表中的搜索结果是否应优先于第二个列表中的搜索结果。

假设没有这样的依赖,所以任何列表中的任何搜索结果都没问题,然后在Ateji PX中以非常简洁的方式表达为推测搜索:

Object parallelSearch(Collection<List> lists)
{
  // start of parallel block
  [
    // create one parallel branch for each of the lists
    || (List list: lists) {

       // start searching lists in parallel
       Object result = search(list);

       // the first branch that finds a result returns it, 
       // thereby stopping all remaining parallel branches
       if(result != null) return result;
    }
  ]
}

术语“推测”意味着您并行运行多个搜索,但您知道只使用其中一个搜索结果。然后,只要您在其中一个搜索中找到结果,就要停止所有剩余的搜索。

如果您在4核计算机上运行此代码,Ateji PX运行时将一次安排4个并行分支,以便充分利用可用的并行硬件。