为了账号安全,请及时绑定邮箱和手机立即绑定

伙计们,Runnable不是可以共享资源吗,为什么我的结果是这样的,奇怪。。。

伙计们,Runnable不是可以共享资源吗,为什么我的结果是这样的,奇怪。。。

bug侠 2017-10-08 19:32:54
这个程序的目的是用双线程跑数据,得出结果输出。(只想输出1个值)当i等于10000时,单线程结果是13580.357929997872双线程结果是:(怎么输出了两个值,还跟单线程的结果不一样)当i等于100000000时,单线程结果是1.3579357998825678E8双线程结果是:(怎么输出了两个值,还跟单线程的结果不一样,而且这两个值还是两个不同的值)这结果太奇怪了。。。付源码package j120;public class j1200 implements Runnable {    double a=1;    long i;        public void run() {            while(i<100000000) {                a+=1.357935793;                i++;            }        System.out.println(a);    }}package j120;public class j1201 {    public static void main(String[] args) {        j1200 a=new j1200();        new Thread(a).start();         new Thread(a).start();     //    new Thread(a).start();     //    new Thread(a).start();    }}
查看完整描述

1 回答

已采纳
?
Developer_Zuck

TA贡献112条经验 获得超42个赞

你两次new的thread不是同一个对象,但这两个不同对象中的handle指向了同一个对象,所以前面的改变了a值时,后面取得的是对象本身内的值,也就是改变后的值

如果你想得到两个线程运行的解果一样,需要再次创建一个j1200对象,运行后,结果一致。

j1200 a = new j1200();

j1200 a2 = new j1200();

new Thread(a).start();

new Thread(a2).start();


查看完整回答
反对 回复 2017-10-08
  • bug侠
    bug侠
    我的意思是想让2个线程交互执行同一个代码,得出一个结果,并且这个结果和单线程的结果一样
  • Developer_Zuck
    Developer_Zuck
    能运行一下我的代码吗?结果不就是你说的这个吗?放到你的代码的相关位置 j1200 a = new j1200(); j1200 a2 = new j1200(); new Thread(a).start(); new Thread(a2).start(); 得出的结过就是两个相同的结果啊,而且是两个线程交互执行的同一段代码,即实现rannabl接口里面的run()方法里面的代码
  • bug侠
    bug侠
    哎,我没说明白,你这种是a按照图纸制造房子,a2按照同样的图纸制造房子,输出2个房子。 我想让2个线程按照同样一张图纸联手制造1栋房子(是联手),数据共通的。 也就是说第1个线程造完地板第2个线程就不用造地板直接造墙,第2个线程造完墙,第1个线程就不用造墙,直接造屋顶,最后得到一个房子。这是联手,数据共通。
点击展开后面2
  • 1 回答
  • 0 关注
  • 1328 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信