目录
线程随机性的展现
执行start()的顺序不代表执行run()的顺序
在使用多线程技术时,代码运行的结果与代码执行顺序或者调用顺序无关。线程是一个子任务,而CPU是以不确定的方式,或者说是以随机的时间来调用线程中的run方法的。所以说线程执行顺序具有随机性。
线程随机性的展现
package ChapterOne.test;
import ChapterOne.myThread.MyThread;
public class Test {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.setName("myThread");
thread.start();
for (int i = 0; i < 100000; i++) {
System.out.println("main= "+ Thread.currentThread().getName());
}
}
}
package ChapterOne.myThread;
public class MyThread extends Thread{
@Override
public void run(){
for (int i = 0; i < 10000; i++) {
System.out.println("run= "+ Thread.currentThread().getName());
}
}
}
运行结果:
start()方法告诉”线程规划器“,该线程已经准备就绪。这里就是让操作系统安排一个时间来调用run()方法执行具体的任务,具有异步随机顺序执行的特点。
多线程随机输出的原因是CPU将时间片分给不同的线程,线程获得时间片后执行相应任务,所以这些线程在交替执行输出,导致上述的输出结果乱序。
时间片就是CPU分配给各个程序的时间,每个线程被分配一个时间片,在当前的时间片内执行线程中对应的任务。注意,当CPU在不同线程上进行切换时是需要耗时的,因此创建的线程越多,运行效率越慢。
如果调用的方法不是thread.start()而是thread.run(),这里就不是异步执行了,而是同步执行。此时,该线程对象就不交给线程规划器来处理了,而是由main线程直接调用run()方法。同步执行的情况下,需要等待run()方法中的代码执行完毕再执行后面的代码。
执行start()的顺序不代表执行run()的顺序
"start()"方法是Java中线程类的一个方法,用于启动一个新的线程。当调用`start()`方法时,JVM会创建一个新的线程,并将该线程放入就绪状态。但是,这并不意味着该线程立即开始执行。实际上,JVM会在适当的时间运行该线程。因此,`start()`方法只是通知JVM在一个合适的时间运行该线程。
执行run()方法的顺序是随机的。
package ChapterOne.test;
public class MyThread extends Thread{
private int i;
public MyThread(int i){
super();
this.i = i;
}
@Override
public void run(){
System.out.println(i);
}
}
package ChapterOne.test;
public class Test {
public static void main(String[] args) {
MyThread tl1 = new MyThread(1);
MyThread tl2 = new MyThread(2);
MyThread tl3 = new MyThread(3);
MyThread tl4 = new MyThread(4);
MyThread tl5 = new MyThread(5);
MyThread tl6 = new MyThread(6);
MyThread tl7 = new MyThread(7);
MyThread tl8 = new MyThread(8);
MyThread tl9 = new MyThread(9);
MyThread tl10 = new MyThread(10);
tl1.start();
tl2.start();
tl3.start();
tl4.start();
tl5.start();
tl6.start();
tl7.start();
tl8.start();
tl9.start();
tl10.start();
}
}
运行结果:
上述结果说明执行start()方法的顺序不代表run()方法的顺序。这从另一个方面也说明了线程是随机执行的。