java多线程调用run和不调用run的区别
2016-05-25 17:42
399 查看
当在java程序中创建一个线程的时候,会三种情况:
1,只运行run方法
2,先执行start,再执行run方法
3,只运行start方法
三者的区别如下:
ps:附上我测试的代码,大家可以注释一部分,自己观看结果
class
OneThread
extends
Thread{
private
int
count
=5;
public
OneThread(String
name){
super();
this.setName(name
);
[align=left] }[/align]
[align=left] @Override[/align]
public
void
run(){
super.run();
while(count
>0){
count--;
System.
out.println("由"
+this.currentThread().getName()+
"计算. count="+count
);
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
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"
);
[align=left] a.start();[/align]
[align=left] b.start();[/align]
[align=left] c.start();[/align]
[align=left] d.start();[/align]
[align=left] a.run();[/align]
[align=left] b.run();[/align]
[align=left] c.run();[/align]
[align=left] d.run();[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]}[/align]
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不会定义线程里面的任务的 |
class
OneThread
extends
Thread{
private
int
count
=5;
public
OneThread(String
name){
super();
this.setName(name
);
[align=left] }[/align]
[align=left] @Override[/align]
public
void
run(){
super.run();
while(count
>0){
count--;
System.
out.println("由"
+this.currentThread().getName()+
"计算. count="+count
);
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
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"
);
[align=left] a.start();[/align]
[align=left] b.start();[/align]
[align=left] c.start();[/align]
[align=left] d.start();[/align]
[align=left] a.run();[/align]
[align=left] b.run();[/align]
[align=left] c.run();[/align]
[align=left] d.run();[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]}[/align]
相关文章推荐
- 如何用HotSwapAgent和DCEVM让java开发像js开发一样高效(JRebel的替代方案)
- Java内存泄漏--程序和内存的关系
- ROC曲线判别线性回归,java实现。
- JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
- 大力推荐的超牛GitHub top 100的Java开源库
- 关于this关键字的用法
- javaIOzongji
- JAVA 三大GC(java6.0)
- Spring下jdbcTemplate增删改查总结
- java设计模式-工厂方法模式
- 二分法查找-Java
- 关于Ubuntu中java的安装
- Java 多态的扩展示例 数据库操作
- 修改eclipse android 默认debug 签名
- SpringMVC_HelloWorld
- JavaEE系列学习1.1-软件工程开发思想之解耦
- 将java源码打成jar包
- Java实现选择排序、插入排序、希尔排序算法
- JSP+Servlet制作Java Web登录功能的全流程解析
- 彻底理解Java中this 关键字