首页 新闻 会员 周边 捐助

为什么set get 不能一直保存变量值呢

0
[已解决问题] 解决于 2020-07-06 10:29
是这样的:
我在A.java里启动了线程 t1.start

在t1线程里(因为功能分类只能在这里赋值) 用set() 方法,给 c.java的 变量 A 赋值。

然后在A.java里 使用 变量A。但发现A总是空值。

debug时发现A确实被赋值了。



这是为什么呢?

c.java里A的值不能一直保存吗?


谢谢



其实我的目的就是想 创建一个文件存放几个常用的全局变量。
还没有的主页 还没有 | 小虾三级 | 园豆:531
提问于:2020-07-03 19:59
< >
分享
最佳答案
0

按照你的描述,假定一个java文件定义一个public类,那么A.java定义了A类,c.java定义了C类。你的意思就是在C中有一个变量A,然后你在A类中创建了一个子线程,并且通过子线程对C类的A变量进行了赋值。但是使用的时候变量A的值总是空,debug的时候正常对吧?
我猜测是时机的问题。假如你在主线程中使用了A类,而在A类创建了子线程,再在子线程对变量A赋值,然后你在主线程访问,很可能是你在访问变量A时,子线程的赋值操作还没有完成,但是你debug的时候,我猜测你是看主线程的变量情况,这样子线程是正常执行的(不受断点影响),所以你在debug的时候就看到变量A有值,而直接运行时变量A没有值。

奖励园豆:5
我是满意吖 | 菜鸟二级 |园豆:386 | 2020-07-03 21:44

是有两个按钮的,正常运行时

第一个 启动线程 set方法赋值。控制台输出时,是有值 的。

第二个 get方法访问变量,但是空值

其实我就是想 创建一个文件存放几个常用的全局变量。

还没有 | 园豆:531 (小虾三级) | 2020-07-04 10:44

@还没有: 你可以把代码贴出来

我是满意吖 | 园豆:386 (菜鸟二级) | 2020-07-04 11:31

@我是满意吖: https://q.cnblogs.com/q/128146/

还没有 | 园豆:531 (小虾三级) | 2020-07-04 15:55

@还没有: 看到了,你在threaddemo中创建了一个新的values对象了,在main方法中主线程和子线程访问的都不是同一个values,当然有问题了

我是满意吖 | 园豆:386 (菜鸟二级) | 2020-07-04 15:59

@我是满意吖: 怎么让main和thread里,访问的是同一个values里的a 呢?

还没有 | 园豆:531 (小虾三级) | 2020-07-04 20:33

@还没有: 可以通过threaddemo的构造方法传进去,做法有很多种,这个只是其中一种做法

我是满意吖 | 园豆:386 (菜鸟二级) | 2020-07-04 23:48

@我是满意吖: setA(a)写到threaddemo的构造方法里?

一样的结果啊

还没有 | 园豆:531 (小虾三级) | 2020-07-05 21:08

@还没有: threaddemo类这么写:
public class threademo extends Thread{
private values vv;
public threaddemo(values vv) {
this.vv = vv;
}
public void run() {
vv.setA(10);
System.out.println("thread:" + vv.getA());
}
}

main.java中创建线程的时候这么写:
System.out.println("=2==");
threademo td = new threademo(vv); // 这里的vv变量就是上面创建的
td.start();
td.join();

这样就是主线程和子线程访问同一个对象了。
另外说一下,你的代码的命名规范需要注意一下。

我是满意吖 | 园豆:386 (菜鸟二级) | 2020-07-05 22:14

@我是满意吖: 嗯。昨天回复后,才想到了。谢谢

还没有 | 园豆:531 (小虾三级) | 2020-07-06 10:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册