java - java多线程回调

标签 java multithreading

我正在尝试对导入作业进行多线程处理,但遇到了导致重复数据的问题。我需要将我的 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/

相关文章:

java - 如何在 Java 中创建 parent-last/child-first ClassLoader,或如何覆盖已在父 CL 中加载的旧 Xerces 版本?

javascript - Selenium /Java : How to write element locator for an element with aria-selected=false

java - JPA 命名查询中的多对一关系

C# 线程方法名称预期错误

iphone - iOS并发/版本分发

java - 有人说 - "a thread enters an object' s monitor” 是什么意思?

java - Spring 存储库和 DATA_FORMAT 与 nativeQuery=false

JavaFX 样式类不会刷新

java - 如何在单独的 java 类中引用线程?

java - 使用多个线程处理单个 HTTP 请求