java:在多线程程序中访问父变量

时间:2018-01-24 11:44:20

标签: java multithreading global-variables visibility

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

这是我的计划如何运作

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

我想要做的就是这样的事情

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

中的

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 ) );
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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