我用谷歌搜索并在这里搜索这个问题,并没有发现任何类似我想要的东西。
我用一些名为Person的对象填充了一个HashSet,我需要设置四到五个线程来搜索这些Person的大文本,线程似乎是从硬件中更好地使用的最佳解决方案。
疑问是,我如何分离这个HashSet并启动4个线程?我尝试创建一个新的HashSet列表并使用这个新的hashset分为4开始一个新线程。
这似乎是一个很好的解决方案,但有没有更好的方法呢?我如何分离散列集并将碎片发送到4个或5个新线程?
答案 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,其中可以并行运行同步任务。