1

我有一个像这样的类,我在其中更新线程中的静态变量。我需要从另一个类访问这个变量。

import java.util.ArrayList;
import java.util.List;

public class VariableUpdater implements Runnable {
    static List < String > abc = new ArrayList < String > ();

    private static VariableUpdater instance = null;

    private VariableUpdater() {}

    public static synchronized VariableUpdater getInstance() {
        if (instance == null) {
            instance = new VariableUpdater();
        }
        return instance;
    }

    public static void main(String[] args) {
        Thread th = new Thread( VariableUpdater.getInstance());
        th.start();
    }

    @Override
    public void run() {
        while (true) {
            System.out.println();
            try {
                abc.add("aa");
                Thread.sleep(1000);
                printContent();
            } catch (Exception e) {
                // TODO: handle exception
            }

        }

    }

    public synchronized void printContent() {
        for (String string: abc) {
            System.out.println(string);
        }
    }
}

并且这个变量需要从另一个类中访问,如下所示:

public class Accessor {
    public static void main(String[] args) {
        VariableUpdater.getInstance().printContent();
    }
}

问题是,在运行 Accessor 类时,列表是空的。

我在这里错过了什么吗?

更新/解决方案

事实证明,我们可以通过使用 Hazelcast 或某种消息传递/缓存实用程序来实现这一点。我会尽快发布完整的解决方案。

资料来源:如何在 java 应用程序之间共享对象?

4

2 回答 2

1

main()在两个不同的类中有两种方法。在运行两种main()方法时,将有两个 JVM 实例,它们不共享任何东西。所以你的清单永远是空的。

使用一种main()方法启动线程。

public class Main{

    //shared state
    public static void main(String[] args){

        VariableUpdator variableUpdatorInstance = ...
        Accessor accessorInstance = ...


        variableUpdatorInstance.start();
        accessorInstance.start();


        //or in your case
        new Thread(new VariableUpdater()).start();
        Thread.sleep(9000); //runs eventually after 9 seconds
        Accessor.print(); 

    }    
}

更新:

class Thread1 extends Thread{

    static List<String> list = new ArrayList<String>();

}

class OtherClass{

    public void someMethod(){
        Thread1.list; //this is how you access static variable of one class in other
    }
}
于 2013-08-31T13:25:40.463 回答
1

从此代码中,您可以访问另一个类对象中的列表

import java.util.ArrayList;
import java.util.List;

 public class VariableUpdater implements Runnable {
 static List < String > abc = new ArrayList < String > ();

private static VariableUpdater instance = null;

private VariableUpdater() {}

public static synchronized VariableUpdater getInstance() {
    if (instance == null) {
        instance = new VariableUpdater();
    }
    return instance;
}

public static void main(String[] args) {
    Thread th = new Thread(new VariableUpdater());
    th.start();
    Accessor.print();
}

@Override
public void run() {
   for(int i=0;i<10;i++) {
        System.out.println();
        try {
            abc.add("aa");
           // Thread.sleep(1000);
            //printContent();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

public synchronized void printContent() {
        System.out.println("List :: " + abc);
}
 }

class Accessor {
public static void print() {
    System.out.println("Accessor");
    VariableUpdater.getInstance().printContent();
  }
}
于 2013-08-31T13:33:35.840 回答