我有一个大的json文件,其中包含很长的信息列表,我需要在许多子线程中只读列表。
在java中,我们只能通过值传递变量,而不是通过引用传递变量,我希望我的程序尽可能在内存/磁盘使用情况下保持亮度。
现在我将完整列表或只有它的子列表传递给我创建的每个线程。
有没有办法从所有线程访问相同的List变量而不将完整的List复制到每个线程?
我需要'只读'列表
这是我的程序的工作方式
1 - 服务(等待文件创建)
2 - 将创建的Json文件内容读入MyList
3 - 使用不同的限制/偏移量启动MyList部分的线程
我想要做的就是这样的事情
List> MyList = JsonToObject(filePath);
executor = Executors.newFixedThreadPool( 10 );
在Luncher课程中
List> 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 );
}
在Child课程中
public void run(){
for ( int i = this.offset ; i < this.limit ; i++ ) {
this.doSomthingWith ( Luncher.Mylist.get( i ) );
}
}
有没有办法从所有线程访问相同的List变量而不将完整的List复制到每个线程?
就在这里。 此外,没有办法将列表或任何其他复杂的数据结构复制到线程中 - 因为线程的内存只包含一堆过程调用帧,其中基本类型和引用的局部变量驻留在其中。 任何复杂的数据结构都驻留在堆内存中,同一进程中的所有线程都可以访问它们。
对列表的引用是按值传递的,因此只需将列表传递给您在线程中使用的任何方法。
不会这样做会让我的程序使用太多记忆吗? 因为我将在主程序和evry子线程中拥有MyList的副本
你说_对列表的引用是通过值_传递的,我认为_在java中传递值_意味着它在被调用函数中复制新变量中的所有值内容,而不仅仅是对值的引用。 你能告诉我这个吗?
请看这里:stackoverflow.com/questions/11397008/
这很有帮助,谢谢
顺便说一下,如果你想异步处理列表的各个部分,看一下使用并行流而不是用线程手动编码:baeldung.com/java-8-streams-introduction
我试一试,再次感谢