首页 新闻 搜索 专区 学院

线程执行顺序。?

0
[已解决问题] 解决于 2021-08-16 09:10
public class TestMyThread {
    public static void main(String[] args) {
        MyRunnable myRunnable=new MyRunnable();
        Thread thread=new Thread(myRunnable,"myRunnable");
        thread.start();
        System.out.println(thread.getName());
    }
}

实现runnable接口

 public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            System.out.println("MyRunnable" + new Date().getTime() + "---"+i + "--count");
        }
    }
}

打印结果

myRunnable
MyRunnable1629025434531---0--count
MyRunnable1629025434531---1--count
MyRunnable1629025434531---2--count
MyRunnable1629025434531---3--count
MyRunnable1629025434531---4--count
MyRunnable1629025434531---5--count
MyRunnable1629025434531---6--count
MyRunnable1629025434531---7--count
MyRunnable1629025434531---8--count
MyRunnable1629025434531---9--count

Process finished with exit code 0

每次运行结果都是这样,似乎是先执行了,打印语句再开启线程执行。
我开启线程是在打印语句之后,预想会出现类似下面这种情况。
MyRunnable1629025434531---0--count
myRunnable
MyRunnable1629025434531---1--count

预想的情况始终没有出现,是因为main方法按顺序执行语句,直到执行到打印语句,,线程还没被真正执行(我猜测的)
为什么,不懂,请大佬指点一二。

15年的夏天的主页 15年的夏天 | 菜鸟二级 | 园豆:206
提问于:2021-08-15 19:17
< >
分享
最佳答案
1

首先你可以看看println的源码,使用了synchronized 关键字修饰,每次只能有一个线程打印输出,线程My thread 很难抢到锁,因为需要一些准备操作,你可以尝试给几Thread.sleep,模拟耗时操作,你这种测试代码运行过快很难模拟真实情况,再一个就是多线程不要大量使用println语句测试,

奖励园豆:5
breast | 菜鸟二级 |园豆:209 | 2021-08-16 08:49
其他回答(2)
0

请继续阅读、深刻理解 Java建立一个线程的机制!
https://www.runoob.com/java/java-multithreading.html
自己去看,收获会更大,

快乐的凡人721 | 园豆:1368 (小虾三级) | 2021-08-15 19:47
1

和print中的synchronized无关,输出结果取决与main线程和异步线程的启动顺序和CPU抢占顺序。
如果你写两个Thread,各循环打印100次,很容易得到交错输出的结果;
1、Thread.start()调用后,该线程也只是Runnable状态,而main线程CPU调度中的Running或Runnable状态。
2、start()方法调用是,系统才真正开始调用native start0()方法为该线程分配资源,这个过程是需要消耗大量资源和时间的。
综合这两点,你上述代码很难看到交错输出,但是还是有概率会交错输出的,只不过这个概率很低。

河图书卦 | 园豆:204 (菜鸟二级) | 2021-08-19 11:49

start0()中是真正开始调用内部虚拟机方法开创该线程,并调用run钩子方法回调run()的实现,先对于print来讲这是一个庞然大物。

支持(1) 反对(0) 河图书卦 | 园豆:204 (菜鸟二级) | 2021-08-19 11:54

@河图书卦: 🙌看到之后,感觉需要了解的东西还有好多,简单的一句代码,藏了好多东西在后面。

支持(0) 反对(0) 15年的夏天 | 园豆:206 (菜鸟二级) | 2021-08-20 10:48

@15年的夏天: 了解多线程并不太难多看源码,重点要突破JVM。我就是个菜鸟,Java用了两年多,JVM啥都不会。

支持(0) 反对(0) 河图书卦 | 园豆:204 (菜鸟二级) | 2021-08-20 13:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册