一个面试题引发的思考:
一个线程上直接调用了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
多线程
执行结果永远都是这样。