Java基础加强之并发(三)Thread中start()和run()的区别

Thread中start()和run()的区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run()   : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

MyThreadTest.java代码

class MyThread extends Thread{
    public void run() {
        System.out.println("线程名:"+Thread.currentThread().getName());
    }
}

public class MyThreadTest {

    public static void main(String[] args) {
        MyThread mythread = new MyThread();
        mythread.start();//运行结果:线程名:Thread-0
        mythread.run();//运行结果:线程名:main
    }

}

结果说明
(01) Thread.currentThread().getName()是用于获取“当前线程”的名字。当前线程是指正在cpu中调度执行的线程。
(02) mythread.run()是在“主线程main”中调用的,该run()方法直接运行在“主线程main”上。
(03) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;此时的run()方法是运行在“线程mythread”上。

Thread类中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()方法。

Thread类中run源码

private Runnable target;public void run() {
    if (target != null) {
        target.run();
    }
}

说明:target是一个Runnable对象。run()就是直接调用Thread线程的Runnable成员的run()方法,并不会新建一个线程。

原文地址:https://www.cnblogs.com/qingyunzong/p/8483314.html

时间: 2024-10-25 15:39:42

Java基础加强之并发(三)Thread中start()和run()的区别的相关文章

Java多线程系列 基础篇03 Thread中start()和run()的区别

1. start() 和 run()的区别 start():启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用(会抛出异常). run() :run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 2. start() 源码(by jdk1.8) public synchronized void start() { //判断状态是否为 New : if (threadStatus != 0) thr

Java多线程3:Thread中start()和run()的区别

原文:http://www.cnblogs.com/skywang12345/p/3479083.html start() 和 run()的区别说明start():它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run():run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明. class MyThread extends Thread{ public void

第4节:Java基础 - 必知必会(中)

第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象类中可以没有抽象方法,JDK8版本开始提供了接口总方法的default实现 抽象类和类一样是单继承的:接口可以实现多个父类 抽象类中可以存在普通的成员变量:接口中的变量必须是static final类型的,必须被初始化,接口中只能有常量,没有变量 解析: 在Java中,我们用abstract来定义抽

【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别

[JAVA]别特注意,POI中getLastRowNum() 和getLastCellNum()的区别 hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1

Java基础复习计划(三)

散碎知识点 Math.round() 方法进行四舍五入计算,实现是:Math.floor(a + 0.5f) floor : 意为地板,指向下取整,返回不大于它的最大整数 ceil : 意为天花板,指向上取整,返回不小于它的最小整数 round : 意为大约,表示"四舍五入",而四舍五入是往大数方向入. 关于方法区溢出: 经常动态生成大量 Class 的应用中,Spring.hibernate 对类进行增强的时候使用 CGLib 类字节码技术 ,其他运行在 JVM 的动态语言: 常见的

Java -- Thread中start和run方法的区别

一.认识Thread的 start() 和 run() 1.start(): 我们先来看看API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法). 多次启动一个线程是非法的.特别是当线程已经结束执行后,不能再重新启动. 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的

java基础梳理--朝花夕拾(三)

1.了解面向对象的编程思想以及面向对象的特性: 对象: EveryThing is Object: 万物皆是对象,在程序中,我们可以将类.接口.方法.属性等都认为是对象: 面向对象: 是一种程序设计方法,它以对象作为基本的单元来构建系统,它利用对象将系统的复杂性隐藏在对象里(即封装),从而构建大型的工业级系统和大型系统. 面向对象包括三个过程: 面向对象分析(OOA).面向对象设计(OOD).面向对象编程(OOP). 面向对象的三个特性: 继承.封装.多态 面向对象和面向过程的区别? 面向过程就

java基础7:I/O包中的其他类

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

JAVA基础语法练习(三)

训练案例1 训练描述 定义一个方法 能接受一个整数(这个整数大于3)打印0到这个整数(包含)之间的所有的偶数 如 接受的数字是6则调用完方法打印出来的偶数是 0 2 4 6 如 接受的数字是 5则调用完方法打印出来的偶数是 0 2 4 操作步骤描述 • 创建一个测试类,在测试类中创建上述方法 • 定义一个无返回值,有参数的方法 • 在方法内部把符合条件的数字打印 • 在主方法中调用这个方法,并传入数字15进行测试 训练案例2 训练描述 随机产生两个整数,随机数的范围均是[1,100],定义方法求