【发布时间】:2013-10-23 07:46:07
【问题描述】:
我有一个基于数组的对象,它实现了如下接口:
public interface PairSupplier<Q, E> {
public int size();
public Pair<Q, E> get(int index);
}
我想在它上面创建一个特定的迭代器:
public boolean hasNext(){
return true;
}
public Pair<Q, E> next(){
//some magic
}
在 next 方法中,我想从 PairSupplier 返回一些元素。
这个元素对于线程来说应该是唯一的,其他线程不应该有这个元素。
由于 PairSupplier 有最终尺寸,这种情况并不总是可能的,但我想接近它。
元素的顺序无关紧要,线程可以在不同时间获取相同的元素。
示例:2 Threads、5 elements - {1,2,3,4,5}
Thread 1 | Thread 2
1 2
3 4
5 1
3 2
4 5
我的解决方案:
我创建了 AtomicInteger 索引,每次下一个调用都会增加它。
PairSupplier pairs;
AtomicInteger index;
public boolean hasNext(){
return true;
}
public Pair<Q, E> next(){
int position = index.incrementAndGet() % pairs.size;
if (position < 0) {
position *= -1;
position = pairs.size - position;
}
return pairs.get(position);
}
pairs 和 index 在所有线程之间共享。
我发现这个解决方案不可扩展(因为所有线程都在递增),也许有人有更好的想法?
此迭代器将由 50-1000 个线程使用。
【问题讨论】:
-
那是完整的代码吗?
-
这个example(s) 可能会有所帮助。
-
@SachinThapa 不,我只想展示问题和可能解决方案的一部分
-
如何将 JMS 用于非持久消息?
-
你说:这个元素对于线程来说应该是唯一的,其他线程不应该有这个元素。但是在你的例子中,线程2访问
1已经被线程 1?还是我错过了什么?啊,我的错,只是阅读不同时间的东西。那么怎么知道线程已经完成了对元素的处理呢?
标签: java multithreading concurrency scalability