将全局I/O参数传递给Java线程
我有一个Java程序,它创建线程,每个线程执行相同的代码(相同的run() 我的主要想法是:将全局I/O参数传递给Java线程,java,multithreading,Java,Multithreading,我有一个Java程序,它创建线程,每个线程执行相同的代码(相同的run() 我的主要想法是: { // Create threads GameOfLifeThread[][] threads = new GameOfLifeThread[vSplit][hSplit]; for(int i=0; i<vSplit; i++){
{
// Create threads
GameOfLifeThread[][] threads = new GameOfLifeThread[vSplit][hSplit];
for(int i=0; i<vSplit; i++){
for(int j=0; j<hSplit; j++){
threads[i][j] = new GameOfLifeThread(initalField, ...);
}
}
// Run threads
for(int i=0; i<vSplit; i++){
for(int j=0; j<hSplit; j++){
// threads[i][j].run();
(new Thread(threads[i][j])).start();
}
}
return ...;
}
而不是
(new Thread(threads[i][j])).start();
对于单个工作线程(即主线程的纯串行执行),initalField会按其应该的方式进行更改
有什么问题吗?看起来数组的元素是按值传递的,但事实并非如此
先谢谢你 只有一个猜测:
initalField必须是易失性的,否则它可能会被线程缓存,并且不会被更改(由其他线程查看),因为它们可以在本地缓存线程
答案可能会解释得更清楚一些。展示你的GameofLiethread代码。可能你对initialField的访问没有同步。@tigran:这也是我的想法,这就是我答案中的volatile所做的。@Burkhard volatile可能是解决方案,但是我们不能不看到实际的代码就这样说,因为任何并发访问协调都不能用volatile字段来解决。@tigran:是的,我想在这种情况下我们永远不会知道。。。
(new Thread(threads[i][j])).start();