java基本教程之Thread中start()和run()的区别 java多线程教程

 更新时间:2014年01月14日 09:55:34   作者:  
这篇文章主要介绍了Thread中start()和run()的区别,Thread类包含start()和run()方法,它们的区别是什么?下面将对此作出解答

Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答。本章内容包括:
start() 和 run()的区别说明
start() 和 run()的区别示例
start() 和 run()相关源码(基于JDK1.7.0_40)

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()的区别示例
下面,通过一个简单示例演示它们之间的区别。源码如下:

复制代码 代码如下:

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) {
        }
    }
}

运行结果:

复制代码 代码如下:

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 gbk转utf-8

    Java gbk转utf-8

    本文主要介绍了Java gbk转utf-8的方法,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • java实现文件的断点续传

    java实现文件的断点续传

    这篇文章主要为大家详细介绍了java实现文件的断点续传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java基础之this关键字的使用

    Java基础之this关键字的使用

    今天给大家带来的是关于Java基础的相关知识,文章围绕着this关键字的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 你知道Spring中为何不建议使用字段注入吗

    你知道Spring中为何不建议使用字段注入吗

    这篇文章主要给大家介绍了关于Spring中为何不建议使用字段注入的相关资料,通过本文你将对Spring的引入方式有更一步的了解,需要的朋友可以参考下
    2021-08-08
  • java8新特性之Optional的深入解析

    java8新特性之Optional的深入解析

    这篇文章主要给大家介绍了关于java8新特性之Optional的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Java深入探索单例模式的应用

    Java深入探索单例模式的应用

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    2022-06-06
  • SpringBoot整合InfluxDB的详细过程

    SpringBoot整合InfluxDB的详细过程

    InfluxDB是一个开源的时间序列数据库,由Go语言编写,适用于存储和查询按时间顺序产生的数据,它具有高效的数据存储和查询机制,支持高并发写入和查询,灵活的数据模型和强大的查询语言,本文介绍SpringBoot整合InfluxDB的详细过程,感兴趣的朋友一起看看吧
    2024-12-12
  • Java多线程之读写锁分离设计模式

    Java多线程之读写锁分离设计模式

    这篇文章主要介绍了Java多线程读写锁分离设计模式,主要利用Java到吗完成read read 并行化、read write 不允许、write write 不允许几项任务,需要的朋友可以参考一下
    2021-10-10
  • java接口私有方法实现过程解析

    java接口私有方法实现过程解析

    这篇文章主要介绍了java接口私有方法实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java基础--反射机制

    Java基础--反射机制

    本文主要介绍了Java反射机制的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03

最新评论