【问题标题】:java : accessing parent variable in multi threaded programejava:在多线程程序中访问父变量
【发布时间】:2018-07-03 10:53:05
【问题描述】:

我有一个包含很长信息列表的大 json 文件,我需要在许多子线程中只读该列表。
在 java 中,我们只能通过值而不是通过引用来传递变量,我希望我的程序尽可能减少内存/磁盘使用量
现在我将完整列表或仅将其子列表传递给我创建的每个线程。
有没有办法从所有线程访问相同的 List 变量,而无需将完整的 List 复制到每个线程中?
我需要“仅阅读”列表

这是我的程序的工作原理

1 - 服务(等待文件创建)
2 - 将创建的 Json 文件内容读入 MyList
3 - 在具有不同限制/偏移的部分 MyList 上启动线程

我正在尝试做的是这样的事情

List<Map<String,String>> MyList = JsonToObject(filePath);
executor = Executors.newFixedThreadPool( 10 );

午餐类

List<Map<String,String>> MyList = JsonToObject(filePath);
executor = Executors.newFixedThreadPool( 10 );
int limit = 10;
int offset= 0;
for ( int i = 0 ; i < MyList.size() && offset <  MyList.size() ; i++ ) {
    offset = i * 10 ;
    Child thread = new Child( limit , offset );
    executor.submit( thread );
}

子类

public void run(){
    for ( int i = this.offset ; i < this.limit ; i++ ) {
        this.doSomthingWith ( Luncher.Mylist.get( i ) );
    }
}

【问题讨论】:

    标签: java multithreading global-variables visibility


    【解决方案1】:

    列表的引用是按值传递的,所以只需将列表传递给您在线程中使用的任何方法。

    【讨论】:

    • 这样做不会让我的程序占用太多内存吗?因为我将在主程序和每个子线程中拥有 MyList 的副本
    • 你说_列表的引用是按值传递的价值。你能帮我澄清一下吗!
    • 这很有帮助,谢谢
    • 顺便说一下,如果你想异步处理列表的一部分,看看使用并行流而不是手动编码线程:baeldung.com/java-8-streams-introduction
    【解决方案2】:

    有没有一种方法可以从所有线程访问相同的 List 变量,而无需将完整的 List 复制到每个线程中?

    是的,有。此外,没有办法将列表或任何其他复杂的数据结构复制到线程中——因为线程的内存只包含过程调用帧的堆栈,原始类型和引用的局部变量驻留在其中。任何复杂的数据结构都驻留在堆内存中,同一进程中的所有线程都可以平等地访问。

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多