当在java程序中创建一个线程的时候,会三种情况:
1,只运行run方法
2,先执行start,再执行run方法
3,只运行start方法
三者的区别如下:
运行方式 | 区别 |
只运行run | 只运行run的时候,多个线程的执行顺序是按代码顺序执行的,只不过执行的线程是当前线程,而不是你定义的线程,比如:你在main函数里面运行了定义了线程1、2、3。那么只调用1.run()、2.run()、3.run()的话,运行的线程实际上还是main线程的,和1、2、3没有关系,这个时候线程类就相当于普通类,调用run方法,就相当于调用了一个普通类的方法 |
先执行start,再运行run | 这时候,才具有线程调用的同步执行效果,执行任务的线程可能是当前线程、也可能是你定义的线程 |
只运行start | 这个时候会把任务的执行交给任务规划器,具体线程的执行需要等待系统去安排,任务执行的时间和顺序也是不确定的,但是这些任务肯定是你定义的线程运行的,而不像只运行run时候的现象,当前主动调用的线程不会参与这些任务的执行,例如像只运行run的情形,main不会定义线程里面的任务的 |
ps:附上我测试的代码,大家可以注释一部分,自己观看结果
class
OneThread
extends
Thread{
private
int
count
=5;
public
OneThread(String
name
){
super
();
this
.setName(
name
);
}
@Override
public
void
run(){
super
.run();
while
(
count
>0){
count
--;
System.
out
.println(
"由"
+
this
.currentThread().getName()+
"计算. count="
+
count
);
}
}
}
public
class
ThreadExample {
public
static
void
main(String
args
[]){
OneThread
a
=
new
OneThread(
"A"
);
OneThread
b
=
new
OneThread(
"B"
);
OneThread
c
=
new
OneThread(
"C"
);
OneThread
d
=
new
OneThread(
"D"
);
a
.start();
b
.start();
c
.start();
d
.start();
a
.run();
b
.run();
c
.run();
d
.run();
}
}