首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么m2()首先运行?

为什么m2()首先运行?
EN

Stack Overflow用户
提问于 2014-11-17 03:56:02
回答 2查看 82关注 0票数 3

下面是密码。输出是1000,b=1000。我不明白为什么每次m2()都会首先运行。

代码语言:javascript
复制
public class TT implements Runnable{
    int b = 100;

    public synchronized void m1() throws Exception {
        b = 1000;
        Thread.sleep(100);
        System.out.println("b =" + b);
    }

    public synchronized void m2() throws Exception {
        Thread.sleep(2000);
        b = 2000;
    }

    public void run() {
        try {
            m1();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        TT tt = new TT();
        Thread t = new Thread(tt);
        t.start();// m1() starts

        tt.m2();// m2() starts

        System.out.println(tt.b);
    }

}
EN

回答 2

Stack Overflow用户

发布于 2014-11-17 04:05:30

Starting a thread takes a while。一个已经在执行的现有线程有一个很大的优势,它已经存在并且只需要获得一个锁,而另一个线程则依赖于在获得一个锁之前创建一个新线程。一个线程只需要获得一个锁就能赢得比赛,把另一个线程拒之门外,不需要从头开始创建的线程很可能会先到那里。

这仍然是一种竞赛条件,您不应该编写依赖于谁先到达那里的代码。

票数 1
EN

Stack Overflow用户

发布于 2014-11-17 04:06:34

如果您希望tt.m2()在t thread完成后运行,那么它就是工作。在t.join()后面添加t.start()。这使得主线程在t完成其工作后运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26965272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档