`
supportopensource
  • 浏览: 515036 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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();):
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:
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:
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:
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()方法,在主线程中顺序执行。



  • 大小: 46 KB
分享到:
评论

相关推荐

    java中thread线程start和run的区别

    主要介绍了java中thread线程start和run的区别,run()是Runnable接口中定义的一个方法,是为了让客户程序员在这个方法里写自己的功能代码的。直接调用和普通的类调用自己的成员方法是没有任何区别的

    Java多线程——Thread类中run()方法和start()方法的区别.docx

    通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行...

    Java Thread中start()和run()的区别_动力节点Java学院整理

    start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。而run() : run()就和普通的...下面通过示例代码给大家介绍了Java Thread中start()和run()的区别,感兴趣的朋友一起看看吧

    Thread中start()和run()的区别_动力节点Java学院整理

    start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。...run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

    java thread start()和run()方法简析

    本文以java中thread的start()和run()的区别做详细介绍, 需要了解跟多的朋友可以参考下

    java基本教程之Thread中start()和run()的区别 java多线程教程

    主要介绍了Thread中start()和run()的区别,Thread类包含start()和run()方法,它们的区别是什么?下面将对此作出解答

    Java中Thread.start()和Thread.run()的区别.docx

    Java是一种功能强大、可靠性高、跨平台的编程语言,适用于各种应用场景。它被广泛用于企业级应用开发、移动应用开发、云计算、大数据处理等领域,是一门值得学习和掌握的编程语言。

    Android:Handler的post()方法和Thread的start()方法执行Thread的run()方法的区别

    * 在java中真正开启线程的方法是这样的。 */ Thread t = new Thread(r); t.start(); setContentView(R.layout.activity_main); System.out.println("Activity--&gt;"+ Thread.currentThread().getId()...

    Java Thread 的 run() 与 start() 的区别.docx

    通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行...

    java试卷及答案

    9 Thread类中最重要的方法是 start 和 run 10 OutputStream类的功能是 接受要输出的字节并将它送往目的地 InputStream类的功能是 输入字节流 11 针对网络通信的不同层次 Java提供的网络功能有四大类:...

    java多线程示例

    Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...

    Java线程面试题大全.docx

    5. Thread 类中的 start () 和 run () 方法有什么区别? 6. Java 中 Runnable 和 Callable 有什么不同? 7. Java 中 CyclicBarrier 和 CountDownLatch 有什么不同? 8. Java 内存模型是什么? 9. Java 中的 volatile...

    基础深化和提高-Java多线程技术

    实现Runnable接口:创建一个类实现java.lang.Runnable接口,实现run()方法,并将该实现类传递给Thread类的构造函数中。然后创建Thread实例并启动线程。 java class MyRunnable implements Runnable { public void r

    【java面试题】综合性经典Java面试题

    Thread类的start()和run()方法的区别 start()方法会创建新的线程并启动该线程,所以该方法会调用其他native方法,而run()方法就是: 正常的Java方法调用,即在原来的线程中执行java代码。 Java中Runnable和...

    JAVA并发编程实践-线程池-学习笔记

    当调用 start 启动线程时 Java 虚拟机会调 用该类的 run方法。 那么该类的 run() 方法中就是调用了 Runnable 对象的 run() 方法。 我 们可以继承重写Thread 类,在其 start 方法中添加不断循环调用传递过来的 ...

    Thread实现多线程

    继承Thread类: 1必须重写run 方法:里面放置的实际的线程体 2 启动线程: 3创建Thread对象 4调用Thread对象的start 方法启动线程

    创建线程的三种方式(Thread、Runnable、Callable).docx

    1. 在Java中负责实现线程功能的类是java.lang.Thread 类。 2. 可以通过创建 Thread的实例来创建新的线程。 3. 每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。 4. ...

    如何使用Java编写多线程程序

    在使用java创建线程的时候,你可以生成一个Thread类或者他的子类对象,并给这个对象发送start()消息(程序可以向任何一个派生自 Runnable 接口的类对象发送 start() 消息的),这样一来程序会一直执行,直到run返回...

    java多线程机制 -- 源码详解

    当lefthand调用start()开始运行时,类Lefthand中的run()将自动被执行。 我们来分析一下上面程序的输出结果。Left线程首先开始执行,这时Lefthand类中的run方法开始执行,输出”I am a student”后,left主动“休息”...

    java 面试题 总结

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

Global site tag (gtag.js) - Google Analytics