多线程机制

线程进行的机制

在我们运行一个进程的时候,会出现主线程和子线程,主线程并不会因为子线程的运行而发生阻塞。

image-20220317101908436

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* @author zss
*/

public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.start();
for (int i=0;i<100;i++){
System.out.println("我是主线程");
try{
Thread.sleep(1000);}catch (Exception e){
System.out.println("线程发生异常");
}
}
}
}
/**当一个类继承了Thread类,该类就可以当作线程使用,run方法来源于Runnable接口*/
class Cat extends Thread{
int time=0;
@Override
public void run(){
while (true){
System.out.println("喵喵,我是小喵咪");
time++;
try{
Thread.sleep(1000);}catch (Exception e){
System.out.println("发生了错误");
}
if (time==20){
break;
}
}
}
}

image-20220317102212202

运行以上程序,可以发现主线程的for循环并没有因为子线程cat的运行而进行停滞,而是不断的交替运行。

为什么使用Start

使用我们cat.run方法也可以调用这个方法,但是为什么使用start方法??

如果我们直接调用Run方法,会发现控制他的线程是main方法,而不是我们的Thread-0线程,这样的就不会交替执行,而是必须将方法执行完毕才可以执行下一个方法。这样就是串行化执行,而不是多线程。

1
2
3
4
5
6
7
8
9
10
11
12
13
public void run(){
while (true){
System.out.println("喵喵,我是小喵咪");
System.out.println(Thread.currentThread().getName());
time++;
try{
Thread.sleep(1000);}catch (Exception e){
System.out.println("发生了错误");
}
if (time==20){
break;
}
}

image-20220317103303292

Start源码

image-20220317104213240

他的底层调用了start0方法,但是start0方法是一个native方法,由jvm底层进行调用,而不是由我们程序员进行调用

image-20220317104331963

在start方法调用start0方法之后,线程并不是立刻执行,而是进入了可执行的状态,而最终的运行是由cpu统一进行调度。