单独的hashset在多个线程上运行列表

时间:2011-12-27 13:46:55

标签: java multithreading

我用谷歌搜索并在这里搜索这个问题,并没有发现任何类似我想要的东西。

我用一些名为Person的对象填充了一个HashSet,我需要设置四到五个线程来搜索这些Person的大文本,线程似乎是从硬件中更好地使用的最佳解决方案。

疑问是,我如何分离这个HashSet并启动4个线程?我尝试创建一个新的HashSet列表并使用这个新的hashset分为4开始一个新线程。

这似乎是一个很好的解决方案,但有没有更好的方法呢?我如何分离散列集并将碎片发送到4个或5个新线程?

4 个答案:

答案 0 :(得分:2)

您可以实现生产者 - 消费者方案:让一个线程逐个读取哈希集中的值并将它们放入队列中,然后由几个工作线程处理。您可以使用ExecutorService类来管理工作人员。

修改:以下是您可以做的事情:

定义您的工人类:

public class Worker implements Runnable {
    private Person p;

    public Worker(Person p) {
        this.p = p;
    }      

    public void run() {
        // search for p
    }
}

在主线程中:

ExecutorService s = Executors.newCachedThreadPool();
for(Person p: hashSet) {
    s.submit(new Worker(p));
}

答案 1 :(得分:2)

对HashSet的访问是O(1)所以如果你将它分成多个线程,它将不会更快。你最好试图拆分搜索文件是昂贵的。但是,如果它足够有效,一个线程将是最佳的。

值得记住的是,使用计算机上的所有核心可能意味着您的程序速度较慢。如果你只是想要耗尽机器上的所有CPU,你可以创建一个线程池,它只会占用你机器上的所有CPU。

答案 2 :(得分:1)

需要考虑的几件事情:

1)你可以使用相同的HashSet,但你需要同步它(用synchronized块包装对它的调用。但是如果你所做的只是查找哈希中的东西,那么多 - 螺纹不会给你买太多。

2)如果要拆分HashSet,则可以考虑对键范围进行拆分。因此,例如,如果您要搜索名称,以A-F开头的名称将进入HashSet1,G-L HashSet2等。这样您的搜索就可以完全平行。

答案 3 :(得分:1)

你使用Iterator迭代哈希集。 &安培;迭代时获取值并创建一个线程并激活它。

否则

您可以使用ExecutorService API,其中可以并行运行同步任务。