【问题标题】:Thread processing in javajava中的线程处理
【发布时间】:2019-03-05 04:28:09
【问题描述】:

我正在尝试为我的项目设计一个高效的线程组件。我的 Java 代码正在使用线程(线程池)读取 1000 个提要文件。每个文件有 1000 行,行可以在多个文件中重复。有可能一半的信息在一个文件中,另一半在另一个文件中(但我们有自己的业务逻辑要关联)。我们正在读取这些文件并插入到数据库中。目前,我们一个一个地插入(使用锁插入数据库只是为了确保所有文件的每条记录只有一行)但我想设计这样的锁应该在记录属性上完成说,emp数据应该是连续的和公司数据一起顺序但emp和公司数据应该并行。另一个我们不知道记录类型的问题,它是动态的。明天我可能会得到工资数据。

【问题讨论】:

  • 您希望我们帮助您解决的具体问题是什么?
  • 我不确定如何设计可以根据对象属性值锁定的组件。
  • "...每个文件有 1000 行,并且行可以在多个文件中重复..." 回到过去,我们会对这些文件进行排序和合并,然后 then 将它们提取到数据库中。
  • 欢迎来到 SO。现在你的问题太具体了,很难理解。你能退后一步,让它更通用吗?或者你能展示一些涉及的实体吗?

标签: java multithreading oop


【解决方案1】:

我认为您希望并行操作一堆数据,并在它们运行时使用不同的操作锁定共享锁。

下面是一个例子:在一张地图中存储多个锁,您可以使用从您的数据(例如员工数据或公司数据)中绘制的一些映射来查找该地图。

import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MultipleLocks {

    static Map<Operation.Type, Lock> locks = new ConcurrentHashMap<>();

    public static void main(String... args) {
        Collection<Operation> operations = new HashSet<>();
        operations.add(new Operation(Operation.Type.ALPHA, () -> System.out.println(1)));
        operations.add(new Operation(Operation.Type.ALPHA, () -> System.out.println(2)));
        operations.add(new Operation(Operation.Type.ALPHA, () -> System.out.println(3)));
        operations.add(new Operation(Operation.Type.BRAVO, () -> System.out.println(4)));
        operations.add(new Operation(Operation.Type.BRAVO, () -> System.out.println(5)));
        operations.add(new Operation(Operation.Type.CHARLIE, () -> System.out.println(5)));

        operations.parallelStream().forEach(operation -> {
            Lock lock = locks.computeIfAbsent(operation.type, type -> new ReentrantLock());
            lock.lock();
            operation.op.run();
            lock.unlock();
        });
    }

    static class Operation {
        enum Type {
            ALPHA, BRAVO, CHARLIE;
        }

        Type type;
        Runnable op;

        Operation(Type alpha, Runnable op) {
            type = alpha;
            this.op = op;
        }
    }
}

【讨论】:

  • 这些操作是静态的。就我而言,我不知道会出现什么数据。我需要在不知道即将到来的数据的情况下对类似类型的锁执行操作。
  • 我不明白。你能发布一小段代码来演示这个问题吗?
  • 我还没有任何代码。试想一下,我有 x 个线程读取文件并将数据存储在数据库中。为了避免同一项目出现多行,我们可以序列化插入(关联内存中同一项目的行)。这会减慢我的插入速度,所以我想基于行标识符(在你的情况下可能是操作类型)进行条件锁定。
  • 听起来你走在正确的轨道上 - 你会有一个行标识符到锁的映射。
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 2020-01-12
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2014-12-19
  • 2013-08-16
相关资源
最近更新 更多