gpt4 book ai didi

java - 在线程java中访问变量

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:25 28 4
gpt4 key购买 nike

我的线程类中有一个全局变量,它是一个 ArrayList<> .我从 main() 定期运行此线程方法;每当此线程运行时,我都会在 run() 中填充此列表方法。我想从我的 main() 访问此列表方法,但每当我从 main() 访问此列表时,我得到一个空列表。请建议我如何实现这一目标,以下是我的代码示例。

private static ArrayList<SampleClass> allproxyDetailsPojoList = null;   

public static void main(String[] args) {
try {
ScheduledExecutorService threadSchedulerService = Executors.newScheduledThreadPool(1);
threadSchedulerService.scheduleAtFixedRate(new SampleThreadClass(), 0, 5, TimeUnit.MINUTES);

Thread.sleep(8000);

SampleThreadClass sampleThreadClass = new SampleThreadClass();

// here i am getting list empty
allproxyDetailsPojoList = sampleThreadClass.getSampleClassList();

} catch (Exception e) {

}
}

这是我的线程类,

public class SampleThreadClass implements Runnable {

ArrayList<SampleClass> sampleClassList = null;

@Override
public void run() {
MyDao myDao = null;
try {
myDao = new MyDao();
sampleClassList = myDao.getSampleClassList();
} catch (Exception e) {

}
}

public ArrayList<SampleClass> getSampleClassList(){
return sampleClassList;
}
}

注意:不能使用static关键字。

最佳答案

您需要了解类的哪些实例与类定义形成对比。在您的代码中,您创建了该类的两个实例。由于变量不是静态的,每个实例都有自己的变量实例。您不能通过实例 2 的引用访问实例 1 的变量。

try {
ScheduledExecutorService threadSchedulerService = Executors.newScheduledThreadPool(1);
threadSchedulerService.scheduleAtFixedRate(new SampleThreadClass(), 0, 5, TimeUnit.MINUTES);
// ^ 1st Instance
Thread.sleep(8000);

SampleThreadClass sampleThreadClass = new SampleThreadClass(); // <-- 2nd Instance

所以要使用一个实例,将其更改为

try {
ScheduledExecutorService threadSchedulerService = Executors.newScheduledThreadPool(1);

SampleThreadClass sampleThreadClass = new SampleThreadClass();
threadSchedulerService.scheduleAtFixedRate(sampleThreadClass , 0, 5, TimeUnit.MINUTES);

Thread.sleep(8000);

但是为了避免“奇怪的行为”,我还会同步访问 sampleClassList .

此外,为了避免 NPE,我会更改

public ArrayList<SampleClass> getSampleClassList(){
return sampleClassList;
}

public ArrayList<SampleClass> getSampleClassList(){
if ( null != sampleClassList )
return sampleClassList;
return Collections.emptyList();
}

但请注意,这个空列表是不可变的。如果你需要一个可变列表,你可以只返回一个 new ArrayList<SampleClass>() .

附言

使用 sleep 并不能真正使这段代码稳定。如果您希望在等待服务调用至少执行一次后实际出现一个列表,您应该这样做,而不是等待一个固定的时间段。但那将是另一个问题。

关于java - 在线程java中访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37340280/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com