作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我应该创建 2 个线程。从文件中读取数据并创建 Merchandise 类的对象。文件本身由 10,000 多行组成:
IdOfMerchandise Weight
第一个线程创建 Merchandise 对象行以及它写入的每 200 个对象。我遇到的问题是,我需要第二个线程,与第一个线程同时工作,获取这些对象并总结总重量,每添加 100 个就编写报告。
如何使用线程在另一个线程中创建对象数据的同时获取对象数据?使用 HashMap 存储带有 2 个变量的新创建的类对象是个好主意吗?
最佳答案
当你将数据从一个线程传递到另一个线程时,你需要一个 thread-safe数据结构。正如您正确指出的那样,HashMap
不是线程安全的。对于 Java 中的线程安全集合,请查看 java.util.concurrent包裹。实现生产者-消费者模式的最简单方法之一是使用 LinkedBlockingQueue。
这是一个包含两个线程的完整示例,一个线程生成对象,另一个线程每 100 个对象消耗并打印一些内容:
AtomicBoolean finished = new AtomicBoolean(false);
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
String createdObject = Integer.toString(i);
queue.offer(createdObject);
}
finished.set(true);
});
Thread thread2 = new Thread(() -> {
int count = 0;
while (!finished.get() || !queue.isEmpty()) {
try {
String object = queue.poll(100, TimeUnit.MILLISECONDS);
if (count++ % 100 == 0) {
System.out.println(object);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
thread1.run(); thread2.run();
thread1.join(); thread2.join();
您可能会注意到一件事 - 除了生产的项目之外,线程还需要交换其他信息 - 当生产者完成时。同样,如果没有同步,您就无法安全地交换此信息。您可以使用 AtomicBoolean
如示例中所示,或 volatile
field 。
关于java - 使用另一个线程获取在一个线程中创建的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013067/
我是一名优秀的程序员,十分优秀!