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

标签 java thread-safety

假设我有这些代码:

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();
}

我想知道,它是线程安全的吗?有没有可能,在第一次迭代中,我期待第一次迭代的文件,但它是由循环的任何其他迭代的文件初始化的?那么,我该如何处理这种情况呢?

我需要将每个文件发送到不同的线程。对于每个文件,将创建一个线程。提前致谢。

编辑:我也读过这个帖子... Enhanced 'for' loop and lambda expressions这个问题和我的完全不同。

最佳答案

以下是 for(...) 每次迭代时发生的情况循环:

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

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

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

<小时/>

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

final fileInThread变量只是同一个 File 的另一个名称。例如file指。同样,每个线程不同

<小时/>

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

关于java - 在线程中使用forEach循环引用的线程安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59974235/

相关文章:

java - GTK 2/3 是否支持高效的虚拟表?

java - Maven 在 CI 服务器上并发构建

java - 此代码应使用 2D ArrayList 实现帕斯卡三角形,但输入的值未传递

python - 在具有请求的线程之间共享 HTTP 连接池的推荐方法是什么?

multithreading - 套接字问题

java - ConcurrentHashMap 作为缓存

ios - 使用线程/ block 安全集合来协调多个异步操作? (NSMutableArray 或 NSMutableSet)

java - 在我的情况下是 Lock+HasMap 还是 ConcurrentHashMap?

java - 为什么这个线程网络代码不起作用? ( java )

java - Primefaces 中是否有任何选取框效果行为......?