go 语言 goroutine 与 主 goroutine 的代码的先行性问题。

demon_li · 2021-06-26 17:46:04 · 3529 次点击

理想情况下是1和3先后顺序随机。实际情况是启动一个goroutine或Thread需要消耗资源,所以一般都是 3 早于 1 先打印出来。 还有就是 go 的输出顺序是 3124 Java也是 3124。你又说不一样,

#3
更多评论

我觉得你啊可能对线程有一些误解.java的线程也不是你想的那样.你得到这个结果一点都不奇怪. 当前执行的线程或者协程是不会马上放弃CPU给其他线程和线程的除非使用了相关的语句和遇到了可以放弃CPU的情况, 你的例子就是这种情况.

#1

package demon.research;

public class BefortTest {

public static  Object lock = new Object();
public static void main(String[] args) {

    try{
        Thread t  = new Thread(new Runnable() {
            @Override
            public void run() {

                System.out.println("start");
                synchronized (lock)
                {
                    lock.notifyAll();
                }


                System.out.println("end");
            }
        });

        t.start();

        System.out.println("wait");
        synchronized (lock)
        {
            lock.wait();
        }

        System.out.println("end all");
    }
    catch (Exception ex)
    {

    }


}

}

打印结果出现以下结果:

wait start end all end

所以Java 代码一定有先行性的考虑,你的解释是不正确的。

#2