`
supportopensource
  • 浏览: 521818 次
  • 性别: 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类中run()方法和start()方法的区别.docx

    在Java多线程编程中,`Thread` 类的 `run()` 方法和 `start()` 方法扮演着不同的角色,它们之间的区别是理解并发执行的关键。 首先,`start()` 方法是真正启动新线程的方法。当你调用 `Thread` 对象的 `start()` ...

    java中thread线程start和run的区别

    `Thread`类是Java中用于创建和管理线程的核心类,而`start()`和`run()`方法是与线程执行密切相关的方法,它们之间存在显著的区别。 首先,`run()`方法是`Runnable`接口或`Thread`类中的一个成员方法。当你需要创建...

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

    在Java编程语言中,理解和掌握线程的使用是至关重要的,特别是`Thread.start()`和`Thread.run()`这两个方法。它们在多线程编程中扮演着关键角色,但有着明显的区别。 首先,`Thread.start()`方法的主要作用是启动一...

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

    在Java多线程编程中,理解`Thread`类的`start()`和`run()`方法的区别至关重要。这两个方法在实现线程并发执行时起到不同的作用。 首先,`start()`方法是用于启动一个新的线程。当你调用`start()`方法时,Java虚拟机...

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

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

    JAVA面试题 start()和run()详解

    本文主要介绍了JAVA面试题中关于启动线程的start()和run()方法的详解。通过示例代码,详细介绍了这两个方法的作用和区别,以及它们在启动线程时的执行过程。 第一点,start()方法和run()方法的区别。在Java中,...

    java的thread类重写run方法的双线程从1加到100

    首先,`Thread`类是Java中的核心类,它代表了程序中的一个执行线程。当你创建一个新的`Thread`对象并启动它时,Java虚拟机(JVM)会为这个线程分配CPU时间片,从而使得代码可以在不同的线程间交替执行。 要实现...

    java线程中start和run的区别详解

    Java线程中start和run的区别详解 在Java编程中,线程是一个基础概念,start和run是两个常用的方法,但是它们之间的区别却经常被忽视。本文将详细介绍Java线程中start和run的区别,通过示例代码帮助大家更好地理解这...

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

    本文将深入探讨`start()` 和 `run()` 方法的区别及其在多线程环境中的作用。 1. **start() 方法** `start()` 方法是启动线程的关键。当你调用 `Thread` 对象的 `start()` 方法时,Java虚拟机(JVM)会执行以下几...

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

    在理解Thread类的start()和run()方法的区别时,我们需要深入探讨它们的工作原理。 首先,start()方法的主要作用是启动一个新的线程并执行该线程的run()方法。当调用start()时,Java虚拟机(JVM)会执行线程的初始化...

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

    Java线程中的`run()`和`start()`方法是线程编程中的关键概念,它们之间有着显著的区别。首先,我们来看一下这两个方法的基本解释。 1. `start()`方法:`start()`是真正启动线程的关键,它使得线程进入就绪(可运行...

    Java中Runnable和Thread的区别

    在Java编程语言中,多线程的实现有多种方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景,理解它们之间的区别对于编写高效、可维护的多线程应用至关重要。 ### 继承...

    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中启动线程start和run的两种方法

    Java中启动线程start和run的两种方法 Java 中启动线程有两种方法,即继承 Thread 类和实现 Runnable 接口。由于 Java 无法实现多重继承,所以一般通过实现 Runnable 接口来创建线程。但是,无论哪种方法都可以通过 ...

    Java线程中start和run方法全面解析

    本文将全面解析Java线程中的`start`和`run`方法,以及自定义线程的两种常见方式。 首先,自定义线程有两种主要方法: 1. 实现`Runnable`接口:创建一个类实现`Runnable`接口,并重写`run`方法。然后,将这个实现了...

    java 线程中start方法与run方法的区别详细介绍

    1. **`start`方法**:当我们调用`Thread`对象的`start`方法时,Java虚拟机(JVM)会创建一个新的线程来执行`run`方法中的代码。这意味着`run`方法的内容将在一个新的独立的执行上下文中运行,与调用`start`方法的...

    Java Thread Programming

    继承Thread类的方法直接扩展Thread类并重写run()方法,而实现Runnable接口则需要创建一个实现了Runnable接口的类,并在run()方法中定义线程的行为。这两种方式各有优缺点,继承Thread类允许直接使用this关键字引用...

    【java学习记录】11.多线程实现阶乘计算(Thread类和Runnable接口)

    在Java中,直接继承`Thread`类并重写`run()`方法是创建线程的一种方式。下面是一个简单的示例: ```java public class FactorialThread extends Thread { private int number; public FactorialThread(int num) ...

    Java Thread用法 经典

    Java中的线程主要通过`java.lang.Thread`类来创建和管理。 #### 二、线程创建方式 在Java中,可以通过以下两种方式创建线程: 1. **继承Thread类:** 创建一个新的类,使其继承自`Thread`类,并重写`run()`方法。...

    Java Thread类1

    Java的线程是通过`java.lang.Thread`类来创建和管理的。当虚拟机启动时,会有一个主线程,即main方法所在的线程。创建新的线程通常涉及以下步骤: 1. **创建Thread实例**:首先,你需要创建一个Thread类的实例,这...

Global site tag (gtag.js) - Google Analytics