繁体   English   中英

在线程中使用 forEach 循环引用的线程安全性

[英]Thread safety of using reference of forEach loop in thread

假设我有这些代码:

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(...)循环每次迭代时发生的情况:

  1. 分配局部变量file以引用给定fileList的下一项。
  2. lambda 表达式创建一个匿名的Runnable类的新实例,并且 lambda捕获file变量的值。
  3. 创建并启动一个新的Thread() ,使用匿名Runnable对象作为其委托。

在循环的每次后续迭代中,都会创建匿名类的不同实例,并且这些实例中的每一个都捕获file不同值。

当这些线程运行时,每个匿名Runnable对象都将拥有自己的、不同的file捕获值。


声明, final File fileInThread = file; 没有必要。 当为每个不同的匿名对象调用run()方法时, file将引用捕获的 value ,这将是每个线程中列表的不同成员。

final fileInThread变量只是file引用的同一个File实例的另一个名称。 同样,每个线程都不同


哦! 我在上面的描述中说的是“lambda”,但Thread()构造函数的实际参数不是 lambda 表达式。 它是匿名内部类的实例化。 类似的想法,但它使用更旧、更冗长的语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM