Java中Thread类的start()和run()的区别

1、start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。

通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后JVM通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程执行体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止,而CPU再运行其它线程,

2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程,只有这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。

记住:线程就是为了更好地利用CPU,提高程序运行速率的!

为了更好地理解两者的区别,看以下的例子:
例程1:
public class TestThread {
public static void main(String arg[]){
NewThread t1 = new NewThread();
NewThread t2 = new NewThread();
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
System.out.println(Thread.currentThread().getName() );
th1.start();
th2.start();
//th1.run();
//th2.run();
}
}
class NewThread implements Runnable{
int i = 0;
public void run() {
for(int i = 0; i <20;i ++){
System.out.println(Thread.currentThread().getName() +" "+ i);
}
}
}

程序的运行结果1(//th1.run();//th2.run();):
[color=blue]main
Thread-0 0
Thread-0 1
Thread-1 0
Thread-0 2
Thread-1 1
Thread-1 2
Thread-0 3
Thread-1 3
Thread-0 4
Thread-1 4
Thread-0 5
Thread-0 6
Thread-1 5
Thread-0 7
Thread-1 6
Thread-0 8
Thread-1 7
Thread-0 9
Thread-1 8
Thread-0 10
Thread-0 11
Thread-0 12
Thread-1 9
Thread-0 13
Thread-0 14
Thread-1 10
Thread-0 15
Thread-0 16
Thread-1 11
Thread-0 17
Thread-1 12
Thread-0 18
Thread-1 13
[b]Thread-0 19[/b]
Thread-1 14
Thread-1 15
Thread-1 16
Thread-1 17
Thread-1 18
[b]Thread-1 19[/b][/color]
程序的运行结果2:(//th1.start();//th2.start();)
[color=blue]main
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b]
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b][/color]

[b]运行结果分析:[/b]线程对象调用start()方法,就表示启动了线程,即又产生了一条执行线索。而调用run()方法,只是相当于普通的方法调用,并没有产生新的执行线索,run()方法仍然在调用它的线程中执行。

如下图1为两种不同情况的比较:

[img]http://dl.iteye.com/upload/attachment/317553/63b75f60-2fa7-3c21-8d60-8ee4cd58a732.jpg[/img]

假设将程序中的注释都去掉:
例程2:
public class TestThread {
public static void main(String arg[]){
NewThread t1 = new NewThread();
NewThread t2 = new NewThread();
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
System.out.println(Thread.currentThread().getName());
th1.start();
th2.start();
th1.run();
th2.run();
}
}
class NewThread implements Runnable{
int i = 0;
public void run() {
for(int i = 0; i <20;i ++){
System.out.println(Thread.currentThread().getName() +" "+ i);
}
}
}

程序的运行结果如下:
[b]第一种结果:[/b]
[color=blue]main
Thread-0 0
Thread-1 0
Thread-1 1
Thread-1 2
main 0
Thread-1 3
Thread-0 1
Thread-1 4
main 1
main 2
main 3
main 4
main 5
Thread-1 5
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-1 6
Thread-1 7
main 6
Thread-1 8
Thread-0 8
Thread-0 9
Thread-1 9
main 7
Thread-1 10
Thread-0 10
Thread-1 11
main 8
main 9
Thread-1 12
Thread-0 11
Thread-1 13
Thread-1 14
Thread-1 15
main 10
Thread-1 16
Thread-1 17
Thread-0 12
Thread-1 18
main 11
Thread-1 19
Thread-0 13
Thread-0 14
main 12
main 13
main 14
Thread-0 15
main 15
Thread-0 16
main 16
main 17
Thread-0 17
main 18
Thread-0 18
[b]main 19[/b]
Thread-0 19[/color]
[b]第二种结果:[/b]
[color=blue]main
main 0
Thread-0 0
Thread-1 0
Thread-0 1
main 1
main 2
Thread-0 2
Thread-1 1
Thread-0 3
main 3
main 4
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-1 2
Thread-0 8
main 5
Thread-0 9
Thread-1 3
Thread-0 10
main 6
Thread-0 11
Thread-1 4
Thread-0 12
main 7
Thread-0 13
Thread-1 5
Thread-0 14
main 8
Thread-0 15
Thread-1 6
Thread-0 16
main 9
Thread-0 17
Thread-1 7
Thread-0 18
main 10
Thread-0 19
Thread-1 8
main 11
Thread-1 9
main 12
Thread-1 10
Thread-1 11
main 13
Thread-1 12
Thread-1 13
Thread-1 14
main 14
Thread-1 15
main 15
Thread-1 16
main 16
main 17
Thread-1 17
main 18
Thread-1 18
[b]main 19[/b]
Thread-1 19
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b][/color]
[color=red]问题:为什么会产生这两种结果?[/color]

例程3:
public class TestThread {
public static void main(String arg[]){
NewThread t1 = new NewThread();
NewThread t2 = new NewThread();
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
th1.start();
th2.start();
for(int i = 0; i <20;i ++){
System.out.println(Thread.currentThread().getName() +" "+ i);
}
th1.run();
th2.run();
}
}
class NewThread implements Runnable{
int i = 0;
public void run() {
for(int i = 0; i <20;i ++){
System.out.println(Thread.currentThread().getName() +" "+ i);
}
}
}

程序的运行结果如下:
[b]第一种结果:[/b]
[color=blue]main 0
main 1
Thread-0 0
Thread-1 0
Thread-1 1
Thread-0 1
Thread-0 2
main 2
Thread-0 3
Thread-1 2
Thread-0 4
Thread-0 5
main 3
Thread-0 6
Thread-1 3
Thread-0 7
main 4
main 5
Thread-0 8
Thread-0 9
Thread-1 4
Thread-1 5
Thread-1 6
Thread-0 10
main 6
Thread-0 11
Thread-1 7
Thread-0 12
Thread-0 13
Thread-0 14
main 7
main 8
main 9
main 10
Thread-0 15
Thread-0 16
Thread-1 8
Thread-0 17
main 11
Thread-0 18
Thread-1 9
Thread-1 10
Thread-1 11
Thread-0 19
main 12
main 13
main 14
Thread-1 12
main 15
Thread-1 13
main 16
Thread-1 14
main 17
Thread-1 15
main 18
[b]main 19[/b]
Thread-1 16
main 0
Thread-1 17
main 1
Thread-1 18
Thread-1 19
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b][/color]
[b]第二种结果:[/b]
[color=blue]Thread-0 0
Thread-1 0
Thread-1 1
Thread-1 2
main 0
Thread-1 3
Thread-0 1
Thread-0 2
Thread-1 4
main 1
Thread-1 5
Thread-1 6
Thread-1 7
Thread-0 3
Thread-1 8
Thread-1 9
main 2
Thread-1 10
Thread-0 4
Thread-1 11
Thread-1 12
main 3
main 4
Thread-1 13
Thread-0 5
Thread-1 14
main 5
Thread-1 15
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-1 16
main 6
Thread-1 17
Thread-0 10
Thread-0 11
Thread-1 18
Thread-1 19
main 7
main 8
main 9
Thread-0 12
Thread-0 13
main 10
Thread-0 14
Thread-0 15
Thread-0 16
main 11
Thread-0 17
main 12
Thread-0 18
main 13
Thread-0 19
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b][/color]
[b]第三种结果:[/b]
[color=blue]main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b]
Thread-1 0
Thread-0 0
Thread-1 1
main 0
main 1
Thread-0 1
main 2
Thread-1 2
Thread-1 3
Thread-1 4
main 3
main 4
Thread-0 2
main 5
Thread-1 5
main 6
Thread-0 3
main 7
Thread-1 6
main 8
Thread-0 4
Thread-0 5
main 9
main 10
main 11
Thread-1 7
main 12
main 13
main 14
Thread-0 6
main 15
Thread-1 8
main 16
Thread-0 7
main 17
Thread-1 9
main 18
[b]main 19[/b]
Thread-0 8
Thread-0 9
main 0
Thread-1 10
main 1
main 2
Thread-0 10
Thread-0 11
Thread-0 12
main 3
Thread-1 11
Thread-1 12
Thread-1 13
main 4
Thread-0 13
main 5
Thread-1 14
main 6
Thread-0 14
main 7
Thread-1 15
main 8
main 9
main 10
Thread-0 15
Thread-0 16
main 11
Thread-1 16
main 12
Thread-0 17
main 13
Thread-1 17
main 14
Thread-0 18
main 15
Thread-1 18
Thread-1 19
main 16
Thread-0 19
main 17
main 18
[b]main 19[/b][/color]
[color=red]问题:为什么会产生这三种结果?[/color]

例程4:
public class TestThread {
public static void main(String arg[]){
NewThread t1 = new NewThread();
NewThread t2 = new NewThread();
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
for(int i = 0; i <20;i ++){
System.out.println(Thread.currentThread().getName() +" "+ i);
}
th1.run();
th2.run();
}
}
class NewThread implements Runnable{
int i = 0;
public void run() {
for(int i = 0; i <20;i ++){
System.out.println(Thread.currentThread().getName() +" "+ i);
}
}
}

程序运行结果如下:
[color=blue]main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b]
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b]
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
[b]main 19[/b][/color]
[b]说明:[/b]在这种情况下才会产生惟一结果。线程对象直接调用run()方法,在主线程中顺序执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值