5.run方法和start方法的区别
run方法与start方法的区别
引言
上一节我们介绍了如何获取和设置线程的名称,本节将介绍run方法与start方法的区别,我们将从5个方面来具体说明它们的区别。
第一个方面是位置,也就是方法所处的位置。
第二个方面是类型,也就是方法是否为同步方法。
第三个方面是作用,主要是看他们各自的功能有什么不同。
第四个方面是线程数量,主要是看方法在执行过程中是否会产生新的线程。
第五个方面是调用次数,主要是看方法调用多次,是否会出现新的问题。
位置
首先我们来看第一个方面,位置。run方法和start的方法都位于thread的类里面。
不过 run方法是重写runnable接口的,这一点它是和start方案有点区别。
类型
我们再来看第二个方面,第二个方面是类型,run方法是非同步方法,而start方法是同步方法,意味着多个线程同时执行start方法时不会存在线程安全问题。
作用
接下来我们再来看第三个方面,第三个方面是作用,run方法的作用是存放任务代码的,例如任务,就是打印这段执行任务的现成的名称,
package com.chenjie.executor.day05; /** * 自定义task */ public class Task implements Runnable{ @Override public void run() { //获取当前正在执行的线程 Thread thread = Thread.currentThread(); //输出线程名称 System.out.println(thread.getName()); } }
而start的方法的作用是启动线程,线程启动以后它会自动去执行run方法,
例如创建线程以后调用它的start的方法启动线程,线程启动以后他就会去执行任务中的run方法。
package com.chenjie.executor.day05; public class Main1 { public static void main(String[] args) { Task task=new Task(); Thread thread = new Thread(task); thread.start(); } }
结果
Thread-0
Process finished with exit code 0
线程数量
接下来我们来看第四个方面。 第四个方面是线程数量,也就是说我们在方法执行的过程中,是否会产生新的线程。
run方法在执行过程中不会产生新的线程,
而start方法在执行过程中会产生一个新线程。
我们可以通过一个例子来验证,自定义一个任务,任务的内容,就是打印当前正在执行任务的线程的名称。首先我们获取当前正在执行任务的线程,然后获取该线程的名称,最后打印该名称
package com.chenjie.executor.day05; /** * 自定义task */ public class Task implements Runnable{ @Override public void run() { //获取当前正在执行的线程 Thread thread = Thread.currentThread(); //输出线程名称 System.out.println(thread.getName()); } }
我们来执行这个任务,首先将任务创建出来,将任务传递给线程。
我们可以看到run方法的执行结果是main,说明执行过程中没有新线程产生
package com.chenjie.executor.day05; public class Main2 { public static void main(String[] args) { //获取当前正在执行的线程 Thread thread = Thread.currentThread(); //输出线程名称 System.out.println(thread.getName()); } }
结果
main
原因就是我们现在代码所处的线程就是主线程,也就是main,所以没有产生新的线程。
我们再来看看start方法的执行结果,start方法的执行结果是thread-0.产生的一个新线程,
package com.chenjie.executor.day05; public class Main1 { public static void main(String[] args) { Task task=new Task(); Thread thread = new Thread(task); thread.start(); } }
这个新的线程去执行了这个任务。通过验证得知run方法它不会产生新线程,而start的方法它就会产生一个新的线程。
调用多次会不会出问题
接下来我们来看第五个方面,第五个方面是方法调用多次会不会出问题。
run方法可以被调用,无数次都不会产生问题,
而start方法虽然说它可以被调用无数次,但是它会出问题原因。在于线程只能被启动一次,它不能重复启动。
接着我们刚刚的程序。我们再次调用start的方法来启动这个线程,看看执行结果会怎样,
package com.chenjie.executor.day05; public class Main1 { public static void main(String[] args) { Task task=new Task(); Thread thread = new Thread(task); thread.start(); thread.start(); } }
结果
Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:708) at com.chenjie.executor.day05.Main1.main(Main1.java:8) Thread-0
果然是出来问题的,发生了异常,那么这个异常是线程状态异常,一般我们重复启动线程就会造成这个异常。
总结
最后我们来总结一下本节的内容,本节介绍了run方法与star方法的区别,
位置方面他们都处于thread类中,只不过呢 run方法是重写runnable接口的.
类型方面,run方法是非同步方法,而start方法是同步方法。
作用方面,run方法的作用是存放任务代码,而start的方法呢是启动线程线程数量方面,
执行run方法它不会产生新线程,而执行start方法会产生新线程,
调用次数方面,run方法可以被执行无数次,而star方法只能被执行一次,原因就在于线程不能被重复启动。
本文来自博客园,作者:小陈子博客,转载请注明原文链接:https://www.cnblogs.com/cj8357475/p/16085969.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本