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
预想的情况始终没有出现,是因为main方法按顺序执行语句,直到执行到打印语句,,线程还没被真正执行(我猜测的)
为什么,不懂,请大佬指点一二。
首先你可以看看println的源码,使用了synchronized 关键字修饰,每次只能有一个线程打印输出,线程My thread 很难抢到锁,因为需要一些准备操作,你可以尝试给几Thread.sleep,模拟耗时操作,你这种测试代码运行过快很难模拟真实情况,再一个就是多线程不要大量使用println语句测试,
和print中的synchronized无关,输出结果取决与main线程和异步线程的启动顺序和CPU抢占顺序。
如果你写两个Thread,各循环打印100次,很容易得到交错输出的结果;
1、Thread.start()调用后,该线程也只是Runnable状态,而main线程CPU调度中的Running或Runnable状态。
2、start()方法调用是,系统才真正开始调用native start0()方法为该线程分配资源,这个过程是需要消耗大量资源和时间的。
综合这两点,你上述代码很难看到交错输出,但是还是有概率会交错输出的,只不过这个概率很低。
start0()中是真正开始调用内部虚拟机方法开创该线程,并调用run钩子方法回调run()的实现,先对于print来讲这是一个庞然大物。
@河图书卦: 🙌看到之后,感觉需要了解的东西还有好多,简单的一句代码,藏了好多东西在后面。
@15年的夏天: 了解多线程并不太难多看源码,重点要突破JVM。我就是个菜鸟,Java用了两年多,JVM啥都不会。