gpt4 book ai didi

java - 使用另一个线程获取在一个线程中创建的数据

转载 作者:行者123 更新时间:2023-12-01 09:58:20 25 4
gpt4 key购买 nike

我应该创建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com