>假设我有这些代码:
for(File file : fileList) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
final File fileInThread = file;
// doing some tasks which may take 5 sec to execute
}
});
thread.start();
}
我想知道的是,它是线程安全的吗?有没有可能在第一次迭代中,我期待第一次迭代的文件,但它是由循环的任何其他迭代的文件初始化的?在这种情况下,我该如何处理这种情况?
我需要将每个文件发送到不同的线程。对于每个文件,将创建一个线程。提前谢谢。
编辑:我也读过这个线程...增强的"for"循环和 lambda 表达式 这个问题与我的问题完全不同。
以下是for(...)
循环每次迭代时发生的情况:
- 局部变量
file
被分配以引用给定fileList
中的下一项。 - lambda 表达式创建匿名
Runnable
类的新实例,lambda捕获file
变量的值。 - 创建并启动一个新的
Thread()
,使用匿名Runnable
对象作为其委托。
在循环的每次后续迭代中,都会创建匿名类的不同实例,并且每个实例捕获不同的值file
。
当这些线程运行时,每个匿名Runnable
对象都将具有自己独特的捕获值file
。
声明,final File fileInThread = file;
是不必要的。 当为每个不同的匿名对象调用run()
方法时,file
将引用捕获的值,该值将是每个线程中列表的不同成员。
final fileInThread
变量只是file
引用的同一File
实例的另一个名称。 同样,每个线程都不同。
哎呀!我在上面的描述中说了"lambda",但Thread()
构造函数的实际参数不是 lambda 表达式。它是匿名内部类的实例化。类似的想法,但它使用更旧、更冗长的语法。