Java线程启动为什么要用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()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MyBatis中select语句中使用String[]数组作为参数的操作方法
在 MyBatis 中,如何在 mapper.xml 配置文件中 select 语句中使用 String[] 数组作为参数呢,并且使用IN关键字来匹配数据库中的记录,这篇文章主要介绍了MyBatis中select语句中使用String[]数组作为参数,需要的朋友可以参考下2023-12-12使用sharding-jdbc实现水平分库+水平分表的示例代码
本文主要介绍了使用sharding-jdbc实现水平分库+水平分表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-12-12Java报错:Error:java: 程序包org.springframework.boot不存在解决办法
建完springboot项目时,点击启动,有可能会报错,下面这篇文章主要给大家介绍了关于Java报错:Error:java: 程序包org.springframework.boot不存在的解决办法,需要的朋友可以参考下2024-02-02Springboot整合SpringSecurity的完整案例详解
Spring Security是基于Spring生态圈的,用于提供安全访问控制解决方案的框架,Spring Security登录认证主要涉及两个重要的接口 UserDetailService和UserDetails接口,本文对Springboot整合SpringSecurity过程给大家介绍的非常详细,需要的朋友参考下吧2024-01-01
最新评论