gpt4 book ai didi

java - java多线程回调

转载 作者:行者123 更新时间:2023-12-01 18:41:55 25 4
gpt4 key购买 nike

我正在尝试对导入作业进行多线程处理,但遇到了导致重复数据的问题。我需要将我的 map 保留在循环之外,以便我的所有线程都可以更新并从中读取,但如果它不是最终的,我就无法执行此操作,并且如果它是最终的,我无法更新 map 。目前,我需要将 Map 对象放入 run 方法中,但是当值最初不在数据库中并且每个线程创建一个新值时,就会出现问题。这会导致数据库中出现重复数据。有人知道如何进行某种回调以更新我的外部 map 吗?

ExecutorService executorService = Executors.newFixedThreadPool(10);

final Map<Integer, Object> map = new HashMap<>();
map.putAll(populate from database);
for (int i = 0; i < 10; i++) {

executorService.execute(new Runnable() {
public void run() {

while ((line = br.readLine()) != null) {
if(map.containsKey(123)) {
//read map object
session.update(object);
} else {
map.put(123,someObject);
session.save(object);
}

if(rowCount % 250 == 0)
tx.commit;
});

}

executorService.shutdown();

最佳答案

您需要使用一些同步技术。

有问题的部分是当不同的线程尝试将一些数据放入映射中时。

示例:

线程 1 正在检查映射中是否存在键为 123 的对象。在线程 1 将新对象添加到映射之前,线程 2 被执行。线程 2 还检查是否存在键为 123 的对象。然后两个线程都将对象 123 添加到映射。这会导致重复...

您可以在此处阅读有关同步的更多信息

http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

关于java - java多线程回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641472/

25 4 0
文章推荐: java - 使用分隔符分割内容
文章推荐: ios - iOS重命名项目
文章推荐: java - 在 java 中扩展 Vector 意味着什么?