Java中Thread类的start()和run()的区别
来源:互联网 发布:武汉人工智能企业 编辑:程序博客网 时间:2024/05/17 02:11
1、start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后JVM通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程执行体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止,而CPU再运行其它线程,
2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程,只有这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
记住:线程就是为了更好地利用CPU,提高程序运行速率的!
为了更好地理解两者的区别,看以下的例子:
例程1:
程序的运行结果1(//th1.run();//th2.run();):
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
Thread-0 19
Thread-1 14
Thread-1 15
Thread-1 16
Thread-1 17
Thread-1 18
Thread-1 19
程序的运行结果2:(//th1.start();//th2.start();)
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
main 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
main 19
运行结果分析:线程对象调用start()方法,就表示启动了线程,即又产生了一条执行线索。而调用run()方法,只是相当于普通的方法调用,并没有产生新的执行线索,run()方法仍然在调用它的线程中执行。
如下图1为两种不同情况的比较:
假设将程序中的注释都去掉:
例程2:
程序的运行结果如下:
第一种结果:
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
main 19
Thread-0 19
第二种结果:
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
main 19
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
main 19
问题:为什么会产生这两种结果?
例程3:
程序的运行结果如下:
第一种结果:
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
main 19
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
main 19
第二种结果:
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
main 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
main 19
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
main 19
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
main 19
问题:为什么会产生这三种结果?
例程4:
程序运行结果如下:
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
main 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
main 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
main 19
说明:在这种情况下才会产生惟一结果。线程对象直接调用run()方法,在主线程中顺序执行。
通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后JVM通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程执行体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止,而CPU再运行其它线程,
2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程,只有这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
记住:线程就是为了更好地利用CPU,提高程序运行速率的!
为了更好地理解两者的区别,看以下的例子:
例程1:
Java代码
- 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();):
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
Thread-0 19
Thread-1 14
Thread-1 15
Thread-1 16
Thread-1 17
Thread-1 18
Thread-1 19
程序的运行结果2:(//th1.start();//th2.start();)
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
main 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
main 19
运行结果分析:线程对象调用start()方法,就表示启动了线程,即又产生了一条执行线索。而调用run()方法,只是相当于普通的方法调用,并没有产生新的执行线索,run()方法仍然在调用它的线程中执行。
如下图1为两种不同情况的比较:
假设将程序中的注释都去掉:
例程2:
Java代码
- 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);
- }
- }
- }
程序的运行结果如下:
第一种结果:
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
main 19
Thread-0 19
第二种结果:
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
main 19
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
main 19
问题:为什么会产生这两种结果?
例程3:
Java代码
- 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);
- }
- }
- }
程序的运行结果如下:
第一种结果:
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
main 19
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
main 19
第二种结果:
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
main 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
main 19
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
main 19
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
main 19
问题:为什么会产生这三种结果?
例程4:
Java代码
- 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);
- }
- }
- }
程序运行结果如下:
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
main 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
main 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
main 19
说明:在这种情况下才会产生惟一结果。线程对象直接调用run()方法,在主线程中顺序执行。
0 0
- Java中Thread类的start()和run()的区别
- java中Thread类里面start和run的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- Java中Thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- java中thread的start()和run()的区别
- Thread中start()和run()的区别
- Thread中start()和run()的区别
- Thread中start()和run()的区别
- Thread中start()和run()的区别
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- File geodatabase size and name limits
- Compile fails with 3.5 framework but succeeds with 4.0
- CPU topology 几个概念
- 字符、字节和编码
- Java中Thread类的start()和run()的区别
- jsp中使用EL判断枚举值相等问题
- 进入MFC讲坛前言四
- HTC G18 刷机教程介绍(适用S-OFF机)
- nginx配置信息
- MPDU and MSDU
- sql统计每5分钟的次数
- (转)cocos2d-x学习笔记13:动作4:其他动作
- Flex——HelloWorld