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小时内与您取得联系。