多线程 - Thread.start() vs Thread.run()
1.Thread.start和Thread.run是什么?
start()方法
线程类的start()方法可以用来启动线程;该方法会在内部调用Runnable接口的run()方法,以在单独的线程中执行run()方法中指定的代码。
start()方法启动线程执行以下任务:
- 它创建了一个新线程
- 线程从New State移动到Runnable状态。
- 当线程有机会执行时,它的目标run()方法将运行。
run()方法
线程类的run()方法是Runnable接口的一个抽象方法,由java虚拟机直接调用的,不会创建的新线程。
2.start() vs run()
方法的定义
- start()方法在java.lang.Thread类中定义;
- run()方法在java.lang.Runnable接口中定义,必须在实现类中重写。
新线程创建
- 当程序调用start()方法时,会创建一个新线程,然后执行run()方法。
- 但是如果我们直接调用run()方法,则不会创建新的线程,run()方法将作为当前调用线程本身的常规方法调用执行,并且不会发生多线程。
多次调用是否抛出异常(易错)
- start()方法只能调用一次,不能多次调用,否则抛出java.lang.IllegalStateException.(对比:Thread.interrupt()可以多次调用,不会有异常)
- run()方法可以进行多次调用,因为它只是一种正常的方法调用。
调用start()代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyThread extends Thread { public void run() { System.out.println( "\n" ); System.out.println( "当前线程的名称: " + Thread.currentThread().getName()); System.out.println( "run()方法调用" ); } } class demo { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); } } |
输出:
正如我们在上面的例子中所看到的,当我们调用线程类实例的start()方法时,会创建一个新的线程,默认名称为Thread-0,然后调用run()方法,并在其中执行所有内容。新创建的线程。
调用run()代码示例
现在,让我们尝试直接调用run()方法而不是start()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyThread extends Thread { public void run() { System.out.println( "\n" ); System.out.println( "当前线程的名称: " + Thread.currentThread().getName()); System.out.println( "run()方法调用" ); } } class GeeksforGeeks { public static void main(String[] args) { MyThread t = new MyThread(); t.run(); } } |
输出:
正如我们在上面的例子中所看到的,当我们调用MyThread类的run()方法时,没有创建新线程,并且在当前线程即主线程上执行run()方法。因此,没有发生多线程。run()方法是作为正常函数被调用。
参考
https://baijiahao.baidu.com/s?id=1624067920453033349&wfr=spider&for=pc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-03-07 SQL Server - case when...then...else...end