首页 > 代码库 > 线程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
多线程
执行结果永远都是这样。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。