「已注销」 2019-09-18 22:15 采纳率: 83.3%
浏览 132
已采纳

刚学习线程,求大神解救

请求各位大神解答

public class TT implements Runnable{
    int b = 100;
    public synchronized void m1() throws Exception {

        b = 1000;
        Thread.sleep(5000);
        System.out.println("------m1---b="+ b);
    }
    public synchronized void m2() throws Exception{
        Thread.sleep(2500);
        b = 2000;
        //System.out.println("m2----"+b);
    }

    public void run() {
        try {
            m1();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        TT tt = new TT();
        Thread t = new Thread(tt);
        t.start();
        tt.m2();   
        System.out.println(tt.b+"***");

    }

}

结果:
1000***
------m1---b=1000

我不清楚这段程序的执行顺序,老师讲的是先执行main线程,然后执行t.start(),也就是调用m1(),但这并没有调用m1()里面的方法,接着执行tt.m2(),执行里面的方法,b=2000之后,调用m1(),中的方法,b=1000,睡眠5秒,输出tt.b+"***"然后再输出System.out.println("------m1---b="+ b);
脑袋都大了......
另外 把m2()中的 //System.out.println("m2----"+b);注解取消结果又不一样
m2----2000
2000***
------m1---b=1000
为什么每次都是m2()先执行呢

  • 写回答

2条回答 默认 最新

  • 毕小宝 博客专家认证 2019-09-19 09:10
    关注

    这里有两个线程 ,main 线程,操作是 tt.m2(),然后另一个是手动开启的 t 线程。但是两个线程都共享了同一个 TT 对象,共同操作其成员变量 b,且都有同步。
    所以访问操作本质上是看谁先执行,理论上谁先执行是由系统环境决定的。把你纠结的点理一下,两个线程都作了什么操作:
    1)main 执行的是 m2() 方法
    2)t 线程执行的是 m1() 方法。
    由于都作了同步,且方法中都有休眠操作,sleep 时不会释放锁,那么谁先启动执行,另一个就会滞后执行。m2 最后一句注释掉的打印对过程并没有影响。
    貌似 m2() 都是先执行,可能是 mian 线程创建的比 t 快。理论上都应该是随机的。

    t.start() 启动线程是需要时间的,包括创建线程、分配资源,执行 run() 方法一系列的操作,而此时 tt.m2() 可能已经被执行了。所以 t 不一定比 main 快的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致