Android中循环启动线程时方法参数传递的正确性确认
循环中启动线程的参数传递正确性分析
你的代码里start_index和end_index的传递方式是完全正确的,完全能避免循环在线程启动后修改参数值的问题,放心用就行!
咱们来拆解下原因:
- 在Java里,匿名内部类(比如你这里的
Runnable)如果要引用外部的局部变量,这个变量必须是final(或者Java 8及以上的「有效final」,也就是赋值后不再被修改)。你这里显式把start_index和end_index声明为final,相当于在每一次循环迭代里都创建了独立的局部变量副本——每个线程捕获的都是当前迭代专属的那个副本,和循环变量i的后续修改彻底没关系。 - 反过来想,如果不做这个
final副本的操作,直接在Runnable里用循环变量i,那所有线程都会共享同一个i的引用。因为循环执行速度远快于线程启动,等线程真正开始运行时,i已经变成循环结束的最终值了,所有线程都会拿到错误的索引范围,这就完全不符合你的预期了。
你代码里的关键保障就是这两行:
final int start_index=i; //start_index final int end_index = i + chunk; //set end_index
它们确保了每一轮循环的线程都拿到属于自己的独立参数,不会被后续迭代干扰。
另外提一句:Java 8及以上版本其实可以不用显式写final,只要这两个变量赋值后不再被修改,编译器会自动识别为「有效final」,但显式声明final的好处是更清晰,能明确告诉阅读代码的人:这两个变量不会被修改,也避免后续不小心改了它们导致编译报错。
内容的提问来源于stack exchange,提问作者user3656651
相关产品推荐
相关产品推荐

