gpt4 book ai didi

java - 如何跨多个线程访问相同的 POJO 实例

转载 作者:行者123 更新时间:2023-12-01 10:39:48 24 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

6年前关闭。




Improve this question




我有一个程序可以处理 Excel 电子表格中的记录。现在,处理大量记录(比如说 100,000 条)需要很长时间。

到目前为止,这是我的类(class)的样子:

public class RecordProcessor{
private Map<Integer, String> statusMap = new HashMap<Integer, String>();
private List<Record> allRecordsToBeProcessed = new ArrayList<Record>();


public static void main(String args[]){

RecordProcessor processor = new RecordProcessor();

processor.loadWorkbook();

processor.processRecords();

processor.writeOutput();

}

public void loadWorkbook(String excelPath){

/**********************************
1. Load the excel worksheet
2. Populate all records into the allRecordsToBeProcessed object
**********************************/

}


public void processRecords(){

/**********************************
Do the actual processing here.
**********************************/
int rowNumber= -1;

for(Record record:allRecordsToBeProcessed){
rowNumber++;
String processingStatus = processRecord(record);
this.statusMap.put(counter, processingStatus);
}

}

private String processRecord(Record record){

//Do something to process this record
//Return either "SUCCESS" or a particular failure message

}

public void writeOutput(){
//Write the output to the excel sheet

for(int rowIndex:this.statusMap.keySet()){

//Write this.statusMap.get(rowIndex) in row with Index rowIndex
}
}
}

我想要做的是将处理拆分为每个 1,000 个单独的线程,这样我就可以节省时间。因此,实际上,我将拥有 100 个线程,每个线程处理 1000 条记录。

这里的另一个要求是,我必须针对我的 Excel 工作表中的每一行更新一个单元格,以指示该特定记录的处理是通过还是失败。

这是我能做的:
  • 我可以编写一个名为 loadAndPaginate() 的方法这会将所有记录变成一个List<Record>每个包含 1,000 条记录的对象(而不是一个包含所有 100,000 条记录的列表)
  • 我可以创建一个实现 Runnable 的类接口(interface)并拥有public String processRecord(Record record)该实现中的方法
  • 然后我可以从这个可运行的实现中创建所需数量的线程并调用 start()方法

  • 我知道这将处理 100,000 条记录并大大减少处理时间。但我不知道该怎么做,如何更新我的 excel 表中的状态?

    我基本上要更新 this.statusMap在我的类(class)(如上所示)中,来自这些并发运行的线程。

    我尝试了以下方法:
  • 初始化 this.statusMap从我的调用类并将其作为构造函数值传递给我的Runnable实现,但我得到的返回是一张从未更新过的 map 。
  • 其他粗略的方法,例如每个线程将其处理的所有记录的状态写入一个文件,并让我的主线程在所有线程停止运行后读取这些文件并将状态写入 excel(我对这种方法不满意)

  • 有人可以指导我正确的设计吗?

    编辑我的问题以回应 Jarrod 的评论

    对不起,如果我的问题感觉太宽泛了。我试着让它变脆。

    这就是我想要实现的
     public class RecordProcessor{

    private Map<Integer, String> statusMap = new HashMap<Integer, String>();

    private List<List<Record>> paginatedRecords;

    //Let's assume I populate the above list like a List having 100 List<Record> that have 1000 Record objects each

    public void processRecords(){
    int i=-1;
    for(List<Record> records:this.paginatedRecords){
    i++;

    //The `RecordProcessorImpl` implements the `Runnable` interface and its `run()` method contains my logic to process a List of records
    RecordProcessorImpl impl = new RecordProcessorImpl(records, this.statusMap);

    Thread t = new Thread(impl, "ProcessorThread-" + i);
    t.start();
    }
    }

    }

    最后 , 我要 this.statusMap更新我需要为 Excel 表中的所有记录写入的所有状态。

    我上面列出的方法不起作用。我的问题是如何写信给 this.stautsMap从多个线程?

    我希望这次我是准确的。

    谢谢,
    斯里拉姆

    最佳答案

    如果您希望 statusMap 可全局访问,您可以将其设为

    public static Map<Integer, String> statusMap = new HashMap<Integer, String>();

    现在可以通过 RecordProcessor.statusMap 访问它

    这个解决方案的问题是,它不是 thread safe .幸运的是,Java 提供了一个线程安全的 HashMap 和 ConcurrentHashMaps。 .所以一个实现可能看起来像
    public static Map<Integer, String> statusMap = new ConcurrentHashMap<Integer, String>();

    当然,如果你愿意,你可以封装 statusMap。
    RecordProcessorImpl impl = new RecordProcessorImpl(records);

    在您的 RecordProcessorImpl 中,您现在可以使用 RecordProcessor.statusMap 访问 map , 如上所述。

    关于java - 如何跨多个线程访问相同的 POJO 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34490467/

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