java – 以线程安全的方式获取集合的内容
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 以线程安全的方式获取集合的内容,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1792字,纯文字阅读大概需要3分钟。
内容图文
![java – 以线程安全的方式获取集合的内容](/upload/InfoBanner/zyjiaocheng/803/b02add4fb0a04b88a6c057205aabc015.jpg)
我想以多线程的方式阅读java Collection的内容.这里有很多关于相同上下文的问题,但在具体的读取点上没有.
我有一个整数的集合.我只想要几个线程迭代它,每个线程一次拉一个整数.我想确保迭代所有集合,并且没有整数被两个不同的线程拉两次.
坦率地说,我不知道什么有效.我知道迭代器不是线程安全的,但是当涉及到只读时我不知道.我做了一些测试来尝试获得线程故障,但没有达到100%的确定性:
int imax = 500;
Collection<Integer> li = new ArrayList<Integer>(imax);
for (int i = 0; i < imax; i++) {
li.add(i);
}
final Iterator<Integer> it = li.iterator();
Thread[] threads = new Thread[20];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread("Thread " + i) {
@Override
public void run() {
while(it.hasNext()) {
System.out.println(it.next());
}
}
};
}
for (int ithread = 0; ithread < threads.length; ++ithread) {
threads[ithread].setPriority(Thread.NORM_PRIORITY);
threads[ithread].start();
}
try {
for (int ithread = 0; ithread < threads.length; ++ithread)
threads[ithread].join();
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
}
编辑:
在实际用例中,每个整数用于开始密集工作,例如查找是否为素数.
上面的例子提取整数列表,没有重复或遗漏,但我不知道它是否是偶然的.
使用HashSet而不是ArrayList也可以,但同样,它可能是偶然的.
如果你有一个通用集合(不一定是列表)并且需要以多线程方式提取其内容,你如何在实践中做?
解决方法:
您的用例将受益于使用队列 – 有一些线程安全的实现,例如ArrayBlockingQueue.
Collection<Integer> li = new ArrayList<Integer>(imax);
final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(li.size(), false, li);
Thread[] threads = new Thread[20];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread("Thread " + i) {
@Override
public void run() {
Integer i;
while ((i = queue.poll()) != null) {
System.out.println(i);
}
}
};
}
这是线程安全的,并且每个线程可以在初始集合的一部分上独立于其他线程工作.
内容总结
以上是互联网集市为您收集整理的java – 以线程安全的方式获取集合的内容全部内容,希望文章能够帮你解决java – 以线程安全的方式获取集合的内容所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。