Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程不共享相同的数据变量_Java_Multithreading - Fatal编程技术网

Java 线程不共享相同的数据变量

Java 线程不共享相同的数据变量,java,multithreading,Java,Multithreading,我是Java新手。我的老师给了我一个关于多线程的家庭作业,其中有两个线程示例和示例1。 Example对线程进行更改,Example1读取该线程。 但是当我实现Example1时,线程不能正常工作 示例线程: public class Example extends Thread { public int[] array = {2,1,0,5,9}; public void run(){ for(int i=0; i<array.length;i++){

我是Java新手。我的老师给了我一个关于多线程的家庭作业,其中有两个线程示例和示例1。 Example对线程进行更改,Example1读取该线程。 但是当我实现Example1时,线程不能正常工作

示例线程:

public class Example extends Thread {
    public int[] array = {2,1,0,5,9};
    public void run(){
        for(int i=0; i<array.length;i++){
            array[i] = array[i]+i;
            System.out.println(getName()+" : "+array[i]);
        }
    }
}
输出为:

t1 : 2
t1 : 2
t1 : 2
t1 : 8
t1 : 13
Thread-1 : 2
Thread-1 : 1
Thread-1 : 0
Thread-1 : 5
Thread-1 : 9
即使示例已经对int[]数组进行了更改,线程Example1也无法读取int[]数组中更改的值。
可能是什么问题以及如何纠正它?

只需将int[]数组设置为静态即可

public static int[] array = {2,1,0,5,9};
输出:

t1 : 2
t1 : 2
t1 : 2
t1 : 8
t1 : 13
t2 : 2
t2 : 2
t2 : 2
t2 : 8
t2 : 13

我认为你这里的问题是误解了实例化的概念

对象本身上有一个数组,因此每次实例化时,都会在该新对象内部创建一个不同的数组

这与将某个对象标记为“静态”的情况不同,后者将强制该对象具有一个实例

所以您有两个选项,使用一个单独的静态项来引用它,它将在所有实例之间共享


在线程化对象之间传递数组或包含数组的某些数据结构,以便您实际操作它,而不是在创建线程化对象时创建的两个不同数组上工作

您可以使用静态,但更好的OO方法是:将其作为实例字段,如:

public class Example extends Thread {
  private int[] array;
  public Example(int[] array) {
    this.array = array;
  }
...
类似地,例如2;然后你进入你的主要领域:

 int[] array = { 1, 2, 3, 4 };
 Example ex1 = new Example(array);
换句话说:您的两个类正在处理两个不同的数组对象。只需将相同的对象交给两个线程即可


可以肯定的是:当您添加此代码时;您可能仍然会看到令人惊讶的结果,因为您有两个线程处理同一数组;可能是并行的。因此,要为各种意外的输出做好准备

您正在使用两个单独的实例。因此,任何地方都没有共享变量。而且,这两个类很奇怪。首先,默认情况下,从
Thread
继承的任何类也实现
Runnable
。由于
Example1
继承自
Example
,而
Example继承自
Thread
,因此根据定义,它也是
可运行的。您确定这些是您的老师给您的类吗?当我从Example1线程中删除实现时,它仍然会给我相同的结果,并且仍然不会读取int[]数组。删除实现不会改变这一点。没有共享变量。您有一个用
new
创建的
Example
实例。您还有一个用
new
创建的
Example1
实例。每个实例都有自己的
数组副本。它们不共享相同的
数组
。也许你应该逐字向我们展示你从老师那里得到的原始作业。如果你将main中对数组的相同引用传递给示例类的构造函数,你就可以通过这种方式共享相同的数据。明白了。谢谢
public class Example extends Thread {
  private int[] array;
  public Example(int[] array) {
    this.array = array;
  }
...
 int[] array = { 1, 2, 3, 4 };
 Example ex1 = new Example(array);