「已注销」 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 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题