Java中Thread类的start()和run()的区别
2013-12-13 15:17
453 查看
1、start()方法来启动线程,真正实现了多线程运行,这时无需等待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()方法,在主线程中顺序执行。
通过调用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()方法,在主线程中顺序执行。
相关文章推荐
- Java -- Thread中start和run方法的区别
- java中thread的start()和run()的区别
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
- JAVA多线程之——Thread中start()和run()的区别
- java中thread的start()和run()的区别
- Java多线程系列--【基础篇03】- Thread中start()和run()的区别
- java中thread的start()和run()的区别
- Java Thread中start和run方法的区别?
- [Java] Thread的start()和run()函数区别
- JAVA多线程之——Thread中start()和run()的区别
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
- Java Thread中start()和run()的区别_动力节点Java学院整理
- java中thread的start()和run()的区别
- JAVA多线程之——Thread中start()和run()的区别
- java多线程系类:基础篇:03Thread中的start()和run()的区别
- java Thread中,run方法和start方法的区别
- JAVA多线程之——Thread中start()和run()的区别
- java中Thread的start()与run()的区别
- java基本教程之Thread中start()和run()的区别 java多线程教程
- Java New Thread start() 与 run()的区别