>我有一个包含一长串信息的大 json 文件,我需要在许多子线程中只读列表。
在 Java 中,我们只能按值传递变量,而不能按引用传递变量,我想让我的程序在内存/磁盘使用率上尽可能轻。
现在,我将完整列表或仅将其子列表传递给我创建的每个线程。
有没有办法从所有线程访问相同的 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 ) );
}
}
对列表的引用是按值传递的,因此只需将列表传递到您在线程中使用的任何方法即可。
有没有办法从所有线程访问相同的 List 变量,而无需将完整的 List 复制到每个线程中?
是的,有。此外,没有办法将列表或任何其他复杂的数据结构复制到线程中 - 因为线程的内存只包含过程调用帧的堆栈,其中驻留了基元类型和引用的局部变量。任何复杂的数据结构都驻留在堆内存中,同一进程中的所有线程都可以平等地访问。