我有一个问题是让两个线程在同一个数组上工作。到目前为止,我并不关心同步,因为我没有让它们在同一个阵列上运行。
到目前为止我尝试了三种方法。 (我认为主函数作为一个线程的执行,所以在代码示例中我只会创建一个线程)。
1)我在main函数内部创建了一个数组,但是当我尝试告诉其run()函数内部的线程来操作main函数中的数组时,它说我引用的数组无法解析为变量。(不要担心allZero(),noZero(),writeZero(),writeOne()。此代码仅为此帖子编写,以便专注于我的真正问题:如何获得两个线程在同一个数组上工作?)
public class StackOverflow1 implements Runnable {
public static void main(String[] args) {
int a[]={0,0,0,0,0,0,0,0,0,0};
Thread thread= new Thread(new StackOverflow1());
thread.start();
while(true){
if(!allZero(a)){
writeZero(a);
}
}
}
@Override
public void run() {
while(true){
if(!noZero(a)){
writeOne(a);
}
}
}
}
2)因此,我创建了一个数组作为确定线程的类的一部分。现在的问题是,当我想操纵main函数中的数组时,它表示它不能对非静态字段进行静态引用。
public class StackOverflow2 implements Runnable {
int []a={0,0,0,0,0,0,0,0,0,0};
public static void main(String[] args) {
Thread thread= new Thread(new StackOverflow2());
thread.start();
while(true){
if(!allZero(a)){
writeZero(a);
}
}
}
@Override
public void run() {
while(true){
if(!noZero(a)){
writeOne();
}
}
}
}
3)如果我创建了一个线程的两个实例,它们都有一个数组作为其类的一部分,那么我只有两个线程都在它们自己的数组上运行。 如何在同一个阵列上运行两个线程?谢谢你的帮助
编辑:我将更详细地描述我目前的情况。在大约三个星期内,我必须写一个关于模拟的考试。考试不包含单个代码行。这将是关于统计学(最大似然估计和chi ^ 2检验的问题)和概率论的全部。但讲座的关键模型是M / M / x队列。我不是编码员。编码不是我的爱好。因此,我会错过书中或Stack Overflow上发表的声明的许多含义。
我想要的是通过使用我的小编码技巧(我甚至不使用队列。它是一个固定长度的数组)来获得M / M / x队列的直觉,以便让我的大脑准备学习讲座和教程中包含的理论。这有意义吗?所以我的问题(考试)已经分解成许多子问题,我在这里要求的只是对我的一个掘金的帮助。公平地说,原始问题隐藏了我的情况。
答案 0 :(得分:1)
1)在这种情况下,数组是main()方法中的局部变量,它不能在main方法之外访问。
2)Main是静态的(即它没有绑定到StackOverflow2的实例),并且数组是一个实例变量。由于main(静态方法)中没有对象实例,因此无法访问其任何实例变量。您可以通过使数组静态(即在所有StackOverflow2实例之间共享)来修复它,但可能不是您所追求的。
3)您可以在main中创建数组,并将其作为参数传递给StackOverflow2的构造函数。然后,您将不得不考虑同步对共享阵列的访问。
答案 1 :(得分:0)
要从另一个线程访问局部变量,请将其声明为final:
final int a[]={0,0,0,0,0,0,0,0,0,0};
这是一个简短的例子:
public class FinalLocalArray {
public static void main(String[] args) {
final int a[]={0,0,0,0,0,0,0,0,0,0};
Thread t = new Thread(new Runnable() {
@Override
public void run() {
a[0] = 1;
}
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
}
a[2] = 1;
System.out.println(Arrays.toString(a));
}
}