首页 > 代码库 > 线程start() 和run()的区别

线程start() 和run()的区别

一个面试题引发的思考:

一个线程上直接调用了run()方法结果如何?我当时想的是抱方法找不到错误,今天测试了一下我错了!找了点资料学习了下,加上自己的理解整理如下(望指点)。

(1)调用start:

调用start()启动一个线程,该线程进入就绪状态,等待cpu分配执行时间,一旦得到执行时间就执行

run()线程体。无需等待该线程执行完毕再执行其他线程,真正实现多线程,cpu不会因为某个线程需要等待资源而进入空闲状态,cpu会被分配给其他线程执行。

测试代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test extends Thread{
     
    public static void main(String[] args) {   
        new Test(){
            @Override
            public void run() {
                for(int i=0;i<1000;i++){
                    System.out.println(i);
                }
            }
        }.start();
        System.out.println("多线程");
    }
     
}

  执行结果:

0
1
2
3
4
5
6
7
8
9
10
11
多线程
12
13
14
15
16

...

多线程的位置不固定:有可能出现在打印数字之前,也有可能出现在数字中间。我想这是因为要看main线程和Test()线程谁先分配到cpu资源吧。

(2)调用run():

run() 就是一个普通的方法,完全可以直接调用,如果直接调用的话,程序只有main线程,程序执行路径也只有一条,还是顺序执行,run()执行完了才能执行其他的,这样就失去了线程的意义。

测试代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test extends Thread{
     
    public static void main(String[] args) {   
        new Test(){
            @Override
            public void run() {
                for(int i=0;i<1000;i++){
                    System.out.println(i);
                }
            }
        }.run();
        System.out.println("多线程");
    }
     
}

  执行结果:

...

993
994
995
996
997
998
999
多线程

执行结果永远都是这样。