Java -- Thread中start和run方法的区别

一、认识Thread的 start() 和 run()

1。start():

我们先来看看API中对于该方法的介绍:

使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。

多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

2。run():

我们还是先看看API中对该方法的介绍:

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

    Thread 的子类应该重写该方法。

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

3。总结:

调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

二、代码实例:

public static void main(String args[]) {
		Thread t = new Thread() {
			public void run() {
				pong();
			}
		};
		t.start();
		System.out.print("ping");
	}

	static void pong() {
		System.out.print("pong");
	}

输出结果: pingpong

public static void main(String args[]) {
		Thread t = new Thread() {
			public void run() {
				pong();
			}
		};
		t.run();
		System.out.print("ping");
	}

	static void pong() {
		System.out.print("pong");
	}

输出结果:pongping

通过以上两个程序实例,可以很容易的区分出start()方法和run()方法的区别:

t.start(); 该行代码相当于是启动线程,

t.run(); 该行代码相当于是使用t这个类中的run方法而已.

三、线程状态说明:

线程状态从大的方面来说,可归结为:初始状态、可运行状态、不可运行状态和消亡状态,具体可细分为上图所示7个状态,说明如下:

1)线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了thread实例后,线程就进入了初始状态;

2)当该对象调用了start()方法,就进入可运行状态;

3)进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;

4)进入运行状态后case就比较多,大致有如下情形: ﹒run()方法或main()方法结束后,线程就进入终止状态; 当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停 止当前线程,但并不释放所占有的资源)。当

sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片; 当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被锁牢(synchroniza,lock),将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线

程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配 CPU时间片; 当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,

是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒

有所线程),线程被唤醒后会进入锁池,等待获取锁标记。 当线程调用stop方法,即可使线程进入消亡状态,但是由于stop方法是不安全的,不鼓励使用,大家可以通过run方法里的条件变通实现线程的 stop。

时间: 2024-10-12 01:21:45

Java -- Thread中start和run方法的区别的相关文章

【Java_多线程并发编程】基础篇—Thread类中start()和run()方法的区别

1. start() 和 run()的区别说明 start()方法: 它会启动一个新线程,并将其添加到线程池中,待其获得CPU资源时会执行run()方法,start()不能被重复调用. run()方法:它和普通的方法调用一样,不会启动新线程.只有等到该方法执行完毕,其它线程才能获得CPU资源. start() 和 run()的区别示例 // Demo.java 的源码 class MyThread extends Thread{ public MyThread(String name) { su

Java多线程系列-start()和run方法的区别

start()和run是Thread类里面的两个方法. 学过的都知道,我们创建了一个线程类,通过调用start()方法来启动线程,并且该线程会执行内部的run()方法,那么我们可以直接调用run()方法吗. 答案显而易见,当然是可以啊,可是前后两者还是有本质的区别的. start()和run() 调用start()方法,会创建一个新的线程,而这个新的线程会执行Thread类中的run方法 调用run()方法,不会创建新的线程,而是直接在当前的线程直接执行该方法. 以上就是这两个方法的本质区别,并

Java线程中yield与join方法的区别

摘要:有人推崇产品,有人推崇运营,也有人推崇战略-到底该推崇什么?李智勇系统地分析了这三者之间的思路,并引用黑格尔的一句话,给出了自己的看法:在尺度中已经蕴含本质,这在产品.运营.战略的侧重上体现的非常好. 视野不拉升或者认知不深入时,就容易在盲人摸象层面上反复,看到微信火了,那就产品最重要,看到阿里火了,那就平台最重要.实际上一个比较显然的事实是,没有锥子一样的产品,那你就火不起来:不能从产品升级为平台,那就很可能活不下去.当然,有些人会说平台也是一种产品,但就和人与猴子都是灵长目,实际上仍是

Java基础加强之并发(三)Thread中start()和run()的区别

Thread中start()和run()的区别 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run()   : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! MyThreadTest.java代码 class MyThread extends Thread{ public void run() { System.out.println("线程名:&qu

Java thread中对异常的处理策略

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是java thread中对于异常的处理情况.由于java thread本身牵涉到并发.锁等相关的问题已经够复杂了.再加上异常处理这些东西,使得它更加特殊. 概括起来,不外乎是三个主要的问题.1. 在java启动的线程里可以抛出异常吗? 2. 在启动的线程里可以捕捉异常吗? 3. 如果可以捕捉异常,对于

(转) Java多线程中start()和run()的区别

Java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体.通过调用Thread类的start()方法来启动一个线程. 在Java当中,线程通常都有五种状态,创建.就绪.运行.阻塞和死亡: 第一是创建状态.在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 第二是就绪状态.当调用了线

Java多线程中start()和run()的区别

Java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体.通过调用Thread类的start()方法来启动一个线程. 在Java当中,线程通常都有五种状态,创建.就绪.运行.阻塞和死亡: 第一是创建状态.在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 第二是就绪状态.当调用了线

Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程

一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. ? threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程对象. # threading.enumerate(): 返回一个包含正在运行的线程的list.正在运行指线程启动后.结束前,不包括启动前和终止后的线程. # threading.activeCount(

jquery中html 与 text方法的区别

jquery中html 与 text方法的区别 24 May 2012/in 网站设计和开发 /by Bruce 接鉵jquery的时间并不长,以前都是用直接用js写的,现在发现在jquery这个框架用起来很方便,不但代码量少了,使用也比较简单,对于浏览器的兼容问题也不用担心,在使用的过程中也会遇到一些疑问,在html标签中附加子标签时所用的方法html()与text()的区别. 通常在用jquery写ajax时,都会用到html()这个方法,而不用text()这个方法,他们之间有什么区别呢?