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

概述:

t.start()会导致run()方法被调用,run()方法中的内容称为线程体,它就是这个线程需要执行的工作。

start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的效果,即在线程的创建和启动中所述的随机性。
而如果使用run()来启动线程,就不是异步执行了,而是同步执行,不会达到使用线程的意义

1.start():

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

“Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.” 
“start()方法会使得该线程开始执行;java虚拟机会去调用该线程的run()方法。”

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

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

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

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调

用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始

执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

2.run():

public class Thread extends Object implements Runnable

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

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

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

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有

一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

3.总结

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

二、代码实例:

通过start启动线程,异步启动

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

通过run启动线程,同步启动

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方法而已,只是主线程的一个普通的方法

三、线程状态说明:

线程状态从大的方面来说,可归结为:初始状态可运行状态不可运行状态消亡状态,说明如下:

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

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

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

4)进入运行状态后情况就比较多,大致有如下情形:

a. run()方法或main()方法结束后,线程就进入终止状态;

b. 当线程调用了自身的sleep()方法其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放

所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片; 当线程刚进入可运行

状态(注意,还没运行),发现将要调用的资源被锁牢(synchroniza,lock),将会立即进入锁池状态,等待获取锁标记(这时

的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就

转入可运行状态,等待OS分配 CPU时间片;

c. 当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状

态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,

但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用

notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。 当线程调用stop方法,即可使线程进入消

亡状态,但是由于stop方法是不安全的,不鼓励使用,大家可以通过run方法里的条件变通实现线程的 stop。

java Thread的start和run方法的区别相关推荐

  1. Thread start()方法和run()方法的区别

    Thread start() 方法 ,是一个线程开始的方法 Thread run() 方法 ,就是一个普通的方法,可以理解为main方法里面的一个普通的方法 下面写一个demo 理解下 Thread ...

  2. run在java_Java语言start和run方法的区别

    Java语言start和run方法的区别 导语:Thread类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法.那么它和start方法有什么不同呢?让我们了解一下吧! 调用start ...

  3. start() 跟 run() 方法的区别和联系

    这里还有个知识点是 start() 跟 run() 方法的区别和联系. 直接调用 start() 方法,此时线程处于一个就绪(可运行)的状态,但是并没有真正的运行.而是得到CPU 的时间片后,开始执行 ...

  4. java Thread 类的几种方法

    //后台进程 /** 对于java来说只要还有一个前台线程在运行,这个进程就不结束,如果一个进程* 只有后台线程,这个进程就会结束*/ package xian_cheng;public class ...

  5. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

  6. java foward_java 中sendredirect()和forward()方法的区别

    HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重定向,forw ...

  7. Java中append方法和add方法的区别

    @TOC append Java里只有StringBuffer和StringBuild才有append方法,Sting里是没有append方法的 在动态数组里添加字符串,相当于+,xxxx" ...

  8. Java中File createNewFile()与mkdir()方法的区别

    什么是文件 比如一张图片.一份文档都是文件 什么是目录 例如:F:\log 应该很容易懂吧 createNewFile()的用法 是在已有目录下创建一个新文件,!!!!注意,是已经存在的目录且该文件不 ...

  9. Java Thread 实现方式

    关于Thread有一个比较有趣的面试题.当你new 一个Thread的时候,直接调用它的run()方法,run()会执行在哪个线程? 答案是调用run()的线程,因为只有在调用start()之后,Ja ...

最新文章

  1. 【Python】Python数据分析来解析,2021年度最具“钱景”的大学专业
  2. 多线程调用同一个方法,局部变量会共享吗
  3. 安装mysql error 1045_安装MySQL出现1045错误
  4. java 响应 请求参数_spring基础----请求与响应的参数(一)
  5. html请求接口_通用网关接口-FastCGI介绍
  6. c语言和java和汇编语言_C语言和汇编语言的区别是什么?
  7. 第8步 第2剑客 mybatis plugin 第三剑客 page helper csdn每天最多发多少文章 是20篇,刚刚才试了。2014
  8. dht11温湿度传感器_Arduino不调用库实现DHT11数据读取
  9. hdu120118岁生日
  10. ios html字符转义字符串,iOS HTML特殊字符转译
  11. oracle 英文版安装,Oracle10gR2 on RHEL4 x86_64安装技术文档(英文原版)
  12. 真安卓机皇!华为P30 Pro包揽《智能硬件质量报告》多项大奖
  13. djano 字段不重复_硬不硬你说了算!近 40 张图解被问千百遍的 TCP 3 次握手和 4 次挥手面试题...
  14. 为了和互联网公司抢程序员,这家世界 500 强也是蛮拼的
  15. [转载] Java中final关键字
  16. 动态调用Webservice 支持Soapheader身份验证(转)
  17. C++ 获取鼠标点击位置
  18. java实现中文转拼音包含声调
  19. Android 快速集成文档校正能力 超简单
  20. element-ui el-dialog 的form 表单验证关闭时清除错误验证信息

热门文章

  1. Pycharm 恢复到默认设置
  2. 描述汇集天地之灵气的上道下器
  3. html 怎么让背景图铺满整个页面
  4. Fluent验证案例05:管道中的泊肃叶流动
  5. 2021年日本互联网服务业发展现状:ZHD和LINE 的合并将改变日本互联网行业格局[图]
  6. 苹果4s怎么越狱_这次是真的!iPhone成功刷入安卓系统,苹果急了......
  7. SyntaxError: Non-UTF-8 code starting with ‘\xb5‘ in file问题如何解决???求助求助!!!
  8. 知识图谱与KBQA——槽填充
  9. vue插槽,分分钟理解
  10. ascii art c语言,ASCII art (简体中文)