【发布时间】:2019-02-04 12:53:10
【问题描述】:
我正在尝试运行具有 4 个线程的程序。我想知道线程中实例变量的行为。在这种情况下,我需要将一个值传递给该方法。所以,我这样做是为了传递值并将其用于进一步处理。
@Component
class ThreadExample implements Runnable
{
String file;
public void setFile(String file)
{
this.file = file;
}
@override
public void run()
{
readFile(file);
}
public void readFile(String fileName)
{
//logic for reading file
}
}
@component
class ThreadCall
{
@Autowired
ThreadExample ex;
public void testThread()
{
ExecutorService executor2 = Executors.newFixedThreadPool(4);
getFiles()
.stream()
.forEach(f-> {
ex.setFile(f);
executor2.submit(ex);
});
}
}
getFiles() api 返回文件名列表。我正在尝试在Spring 中进行操作。
在这里,4 个线程将同时工作。对象ex 是autowired,所以它只会被实例化一次。
file 变量值会如何影响?
我在想,一个线程会尝试通过setFile(file) 设置文件,然后在readFile 中使用它之前,它会被另一个线程更改。
如何解决这个问题?如何在多线程中传递值?
如果我将'file'设为volatile,我的问题会得到解决吗?
【问题讨论】:
-
"对象 ex 是自动装配的,因此它只会被实例化一次。"嗯,真的不是。更准确地说,
ThreadExample是一个组件,所以它只会被实例化一次。 -
您想要做的事情和您想要做的事情之间似乎存在逻辑上的不匹配。当你有一个线程池时,你通常希望提交几个新线程,而不是一遍又一遍地提交一个单例
标签: java spring multithreading