import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class NewTest {
public static void main(String[] args) {
String mystr = "banana";
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < mystr.length(); i++) {
Runnable task = () -> {
System.out.print(mystr.charAt(i));
};
executor.submit(task);
}
executor.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
它们需要是最终的,因为你内部的变量Runnable与外部的变量是相同的:实际上,它们是不同的变量,具有相同的名称。
为了避免混淆,Java 强制在 内部使用的变量的值Runnable是最终的(或实际上最终的),以便它们不能在内部或外部更改Runnable,这意味着它们在内部和外部必须具有相同的值。
修复很简单:分配i给循环内的另一个(最终)变量:
for (int i = 0; i < mystr.length(); i++) {
int ii = i; // ii is effectively final.
Runnable task = () -> {
System.out.print(mystr.charAt(ii));
};
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |