Java线程Run和Start的区别
先上结论:run只是Thread里面的一个普通方法,start是启动线程的方法。何以见得呢?可以执行下面的代码看看run和start的区别:
package com.basic.thread; /**
* @author zhangxingrui
* @create 2019-02-16 20:12
**/
public class TestRunAndStart { private static void sayHello(){
System.out.println("hello, world");
} public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
sayHello();
System.out.println("Current thread: " + Thread.currentThread().getName());
}
}); thread.run();
thread.start();
} }
执行结果:

由此可以看到子线程是由start来启动的,里面调用了run,所以打印出来的是子线程的name。
另外也可以从start方法的底层代码看到,首先进入start方法里面
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
里面调用了start0,继续跟进
private native void start0();
哦,这里就调了native方法了,再往下我们就看不到了。但是可以去openjdk的源码里面去看一下,我用的是jdk8。
去openjdk看源码
https://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/f0b93fbd8cf8/src/share/native/java/lang/Thread.c

这里调用了JVM_StartThread,在jvm.h里面
继续进入
https://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/76a9c9cf14f1/src/share/vm/prims/jvm.cpp

重点看最下面的语句native_thread = new JavaThread(&thread_entry, sz),好,new JavaThread的时候传入了thread_entry,我们再去
看一下啊thread_entry是什么:

在thread_entry这个函数里面调用call_virtual方法,重点是它传入的参数run_method_name,从这里我们就知道了,噢,
原来start最终会在新线程里面调用run方法。
Java线程Run和Start的区别的更多相关文章
- Java线程—-Runnable和Callable的区别和联系
Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { ...
- JAVA线程sleep和wait方法区别
一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能 ...
- Java线程wait和sleep的区别
Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是 有所不同的: wait是Object中的方法,而sleep则是Thread中的 ...
- JAVA线程sleep和wait方法区别 代码
package test; import java.util.Date; import java.util.Random; public class test { public static void ...
- java线程中yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- Java Thread 的 run() 与 start() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. ...
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- JAVA线程和进程区别
1,JAVA线程和进程区别? (1)简单来讲一个运行的程序就是一个进程,一个进程中可以有多个线程(线程是程序执行的最小单元). (2)线程有四种状态:运行,就绪,挂起,结束 (3)使用多线程的好处 使 ...
- java 线程同步 原理 sleep和wait区别
java线程同步的原理java会为每个Object对象分配一个monitor, 当某个对象(实例)的同步方法(synchronized methods)被多个线程调用时,该对象的monitor将负责处 ...
随机推荐
- javaSE、javaEE、javaME
javaSE.javaEE.javaME区别: Java SE 是做电脑上运行的软件. Java EE 是用来做网站的-(我们常见的JSP技术) Java ME 是做手机软件的.
- Android SDK 的SDK Manager打不开,一闪就退,无法启动,解决方法
前一分钟还能打开,在eclipse中点了更新SDK后就启不动了 看下目录的修改时间,tool目录已经是今天的时间, 在升级过程中修改过了,给他改名 tempToolsDir 改名为tool 再尝试下启 ...
- Linux-- su和sudo 切换用户
su 切换用户 用法:su [选项] [-] [用户 [参数]... ] - :以 login-shell 方式进行登录 不加 - :以 no-login-shell 方式进行登录 -c:只进行一次在 ...
- bfs,队列
bfs bfs=队列 队列的操作 头文件 #include<deque> 声明方法: 1.普通声明 queue<int>q; 2.结构体 struct node { int x ...
- MySQL——安装
1. 下载源: http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql80-community-release-el7-2.no ...
- 随机获取指定范围内N个不重复数字
/// <summary> /// 随机获取指定范围内N个不重复数字 /// </summary> /// <param name="min"> ...
- linux静态IP最简配置
vi /etc/sysconfig/network-scripts/ifcfg-xxx TYPE="Ethernet"BOOTPROTO="static"ONB ...
- MySQL----navicat for mysql(破解版)可视化数据库操作
本博文介绍破解版navicat for mysql的安装方法及常用操作 navicat for mysql是一个专业的MySQL数据库图形化界面工具. 百度云下载地址:https://pan.baid ...
- swiper在vue中正确的使用方法
1.安装swiper,执行npm install vue-awesome-swiper --save命令 2.在main.js中添加下面三行 import 'swiper/dist/css/swipe ...
- swiper插件几个容易忽略的地方
以下内容为swiper4版本的 1.在我们用swiper插件做轮播的当我们左右滑动后会出现自动轮播停止了 此时我们需要在autoplay中 加上这个属性 autoplay:{ delay:1000, ...