Java线程启动为什么要用start()而不是run()?

 更新时间:2021年12月12日 10:56:54   作者:bkpp976  
这篇文章主要介绍了线程启动为什么要用start()而不是run()?下面文章围绕start()与run()的相关资料展开详细内容,具有一定的参考价值,西药的小火熬版可以参考一下,希望对你有所帮助

1、直接调用线程的run()方法

public class TestStart {
    public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(){

           @Override
           public void run() {
               System.out.println("Thread t1 is working..."+System.currentTimeMillis());
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       };
       t1.run();
       Thread.sleep(2000);
       System.out.println("Thread Main is doing other thing..."+System.currentTimeMillis());
    }
}

可以看到主线程在t1.run()运行之后再过三秒才继续运行,也就是说,直接在主方法中调用线程的run()方法,并不会开启一个线程去执行run()方法体内的内容,而是同步执行。

2、调用线程的start()方法

public class TestStart {
    public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(){

           @Override
           public void run() {
               System.out.println("Thread t1 is working..."+System.currentTimeMillis());
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       };
       t1.start();
       Thread.sleep(2000);
       System.out.println("Thread Main is doing other thing..."+System.currentTimeMillis());
    }
}

startVSrun1.JPG 可以看到在,在执行完t1.start()这一行之后,主线程立马继续往下执行,休眠2s后输出内容。 也就是说,t1线程和主线程是异步执行的,主线程在线程t1的start()方法执行完成后继续执行后面的内容,无需等待run()方法体的内容执行完成。

3、总结

  • 1、开启一个线程必须通过start()方法,直接调用run()方法并不会创建线程,而是同步执行run()方法中的内容。
  • 2、如果通过传入一个Runnable对象创建线程,线程会执行Runnable对象的run()方法;否则执行自己本身的run()方法。
  • 3、不管是实现Runnable接口还是继承Thread对象,都可以重写run()方法,达到执行设定的任务的效果。

到此这篇关于线程启动为什么要用start()而不是run()?的文章就介绍到这了,更多相关start()与run()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一次排查@CacheEvict注解失效的经历及解决

    一次排查@CacheEvict注解失效的经历及解决

    这篇文章主要介绍了一次排查@CacheEvict注解失效的经历及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java编程实现屏幕截图(截屏)代码总结

    java编程实现屏幕截图(截屏)代码总结

    这篇文章主要介绍了java编程实现屏幕截图(截屏)代码,结合3个实例总结分析了Java截屏时页面抓取及图片保存的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • SpringCloud两种注册中心的实现

    SpringCloud两种注册中心的实现

    本文主要介绍了SpringCloud两种注册中心的实现,包括服务注册、服务拉取、负载均衡和实例权重配置等,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • Maven之远程仓库的配置详解

    Maven之远程仓库的配置详解

    这篇文章主要介绍了Maven之远程仓库的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring Cloud Feign原理详解

    Spring Cloud Feign原理详解

    Feign 主要是帮助我们方便进行rest api服务间的调用,本文从Spring Cloud对feign封装的源码中去了解其主要实现机制
    2021-06-06
  • Java面试必考之如何在项目中优雅的抛出异常

    Java面试必考之如何在项目中优雅的抛出异常

    这篇文章主要为大家详细介绍了Java中的几种异常关键字和异常类相关知识,本文比较适合刚入坑Java的小白以及准备秋招的大佬阅读,需要的可以收藏一下
    2023-06-06
  • Java Springboot整合支付宝接口的教程详解

    Java Springboot整合支付宝接口的教程详解

    这篇文章主要为大家详细介绍了Java Springboot实现整合支付宝接口的教程,文中的示例代码讲解详细,具有一定的参考价值,需要的可以参考一下
    2023-02-02
  • Java项目中如何引入Hutool工具类并正确使用它

    Java项目中如何引入Hutool工具类并正确使用它

    Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,这篇文章主要给大家介绍了关于Java项目中如何引入Hutool工具类并正确使用它的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java线程的生命周期的详解

    Java线程的生命周期的详解

    这篇文章主要介绍了Java线程的生命周期的详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Java提取两个字符串中的相同元素方法

    Java提取两个字符串中的相同元素方法

    今天小编就为大家分享一篇Java提取两个字符串中的相同元素方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论