全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

start() 和 run()的区别说明

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。

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

下面以代码来进行说明。

class MyThread extends Thread{ 
  public void run(){
    ...
  } 
};
MyThread mythread = new MyThread();

mythread.start()会启动一个新线程,并在新线程中运行run()方法。

而mythread.run()则会直接在当前线程中运行run()方法,并不会启动一个新线程来运行run()。

start() 和 run()的区别示例

下面,通过一个简单示例演示它们之间的区别。源码如下: 

 // Demo.java 的源码
 class MyThread extends Thread{ 
   public MyThread(String name) {
     super(name);
   }
   public void run(){
     System.out.println(Thread.currentThread().getName()+" is running");
   } 
 }; 
 public class Demo { 
   public static void main(String[] args) { 
     Thread mythread=new MyThread("mythread");
     System.out.println(Thread.currentThread().getName()+" call mythread.run()");
     mythread.run();
     System.out.println(Thread.currentThread().getName()+" call mythread.start()");
     mythread.start();
   } 
 }

运行结果:

main call mythread.run()
main is running
main call mythread.start()
mythread is running

结果说明:

(01) Thread.currentThread().getName()是用于获取“当前线程”的名字。当前线程是指正在cpu中调度执行的线程。

(02) mythread.run()是在“主线程main”中调用的,该run()方法直接运行在“主线程main”上。

(03) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;此时的run()方法是运行在“线程mythread”上。 

start() 和 run()相关源码(基于JDK1.7.0_40)

Thread.java中start()方法的源码如下: 

public synchronized void start() {
  // 如果线程不是"就绪状态",则抛出异常!
  if (threadStatus != 0)
    throw new IllegalThreadStateException();
  // 将线程添加到ThreadGroup中
  group.add(this);
  boolean started = false;
  try {
    // 通过start0()启动线程
    start0();
    // 设置started标记
    started = true;
  } finally {
    try {
      if (!started) {
        group.threadStartFailed(this);
      }
    } catch (Throwable ignore) {
    }
  }
}

说明:start()实际上是通过本地方法start0()启动线程的。而start0()会新运行一个线程,新线程会调用run()方法。

private native void start0(); 

Thread.java中run()的代码如下:

public void run() {
  if (target != null) {
    target.run();
  }
}

说明:target是一个Runnable对象。run()就是直接调用Thread线程的Runnable成员的run()方法,并不会新建一个线程。

以上所述是小编给大家介绍的Java Thread中start()和run()的区别_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# thread  # start  # run区别  # run  # JAVA面试题 start()和run()详解  # java基本教程之Thread中start()和run()的区别 java多线程教程  # java thread start()和run()方法简析  # Java线程启动为什么要用start()而不是run()?  # 小编  # 是一个  # 是在  # 在此  # 是指  # 会在  # 并在  # 给大家  # 则会  # 所述  # 抛出  # 给我留言  # 感谢大家  # 新建一个  # 疑问请  # 有任何  # 直接调用  # Java  # Demo  # String 


相关文章: php json中文编码为null的解决办法  如何快速搭建响应式可视化网站?  安云自助建站系统如何快速提升SEO排名?  如何确认建站备案号应放置的具体位置?  如何通过万网虚拟主机快速搭建网站?  如何通过虚拟主机空间快速建站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  网站制作说明怎么写,简述网页设计的流程并说明原因?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  高端建站如何打造兼具美学与转化的品牌官网?  建站主机是否等同于虚拟主机?  Thinkphp 中 distinct 的用法解析  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何通过免费商城建站系统源码自定义网站主题与功能?  Android自定义listview布局实现上拉加载下拉刷新功能  如何高效利用亚马逊云主机搭建企业网站?  如何在IIS中新建站点并解决端口绑定冲突?  网站企业制作流程,用什么语言做企业网站比较好?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  如何在自有机房高效搭建专业网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何快速完成中国万网建站详细流程?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站之星后台密码遗忘如何找回?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何通过西部建站助手安装IIS服务器?  存储型VPS适合搭建中小型网站吗?  定制建站策划方案_专业建站与网站建设方案一站式指南  专业网站建设制作报价,网页设计制作要考什么证?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何快速生成凡客建站的专业级图册?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  制作公司内部网站有哪些,内网如何建网站?  *服务器网站为何频现安全漏洞?  浅谈Javascript中的Label语句  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何在云主机快速搭建网站站点?  Swift开发中switch语句值绑定模式  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。