(一)Thread的run() 和 start() 方法

kevinlogs 2018-06-14 原文

(一)Thread的run() 和 start() 方法

Java多线程在实际开发中会遇到很多问题,对于这种争抢CPU时间片段的选手,我们或许有很多困惑,捉摸不透。即便如此,它也是可以被我们控制的。

最近在看Java多线程的书籍,里面有好多我曾经不怎么注意的问题和细节,今天就来和大家分享一下下

我创建了一个类,写了main方法,如下

public class Demo1 {

    public static void main(String[] args){
        Thread t = new MyThread();
        t.start();
        t.run();
    }
}

class MyThread extends Thread{
    /*
    这是被主线程调用的,即main
     */
    public MyThread(){
        System.out.println("run方法的打印1:" + Thread.currentThread().getName());
    }

    /*
    这是被子线程调用,也就是说主线程调用一切子线程,所以构造器里的方法会先执行。同时我们也要理解,
    当一个方法启动时,至少启动两个线程,一个是main,一个是GC(垃圾回收器)
    run方法本身是被main函数调用的
     */
    @Override
    public void run() {
        System.out.println("run方法的打印2:" + Thread.currentThread().getName());

    }
}

然后运行,控制台打印结果为

在这里,我突然想到了一个疑问,run和start到底有什么区别?

我查找了一些资料,解答是这样的,我也比较认可。

1) start:
  用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
  run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。

posted on 2018-06-14 23:33 KevinDwb 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为kevinlogs原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kevinlogs/p/9185492.html

(一)Thread的run() 和 start() 方法的更多相关文章

  1. java多线程 – 线程池

    系统启动一个新线程成本比较高,当程序中需要创建大量生存期很短暂的线程时,使用线程池可以很好的提高性能。 与数据 […]...

  2. Thread中run和start方法的模板设计模式

        创建一个Thread需要继承Thread重写run方法或者实现Runnable接口中的run方法,其实 […]...

  3. 近期业务需要所引发的性能优化问题,浅谈线程池性能优化

      线程池对于性能优化无处不在 1.楼主在平时产品开发过程中所遇到的性能问题,特别是最近特别流行的微服务架构、 […]...

  4. java多线程系列(九)—ArrayBlockingQueue源码分析

    java多线程系列(九)—ArrayBlockingQueue源码分析 目录 认识cpu、核心与线 […]...

  5. java多线程总结-同步容器与并发容器的对比与介绍

    1 容器集简单介绍 java.util包下面的容器集主要有两种,一种是Collection接口下面的List和 […]...

  6. 进程知多少?

    目录 进程为什么出现? 进程的组成 如何竞争资源(调度算法) FCFS RR SPN SRT HRRN FB […]...

  7. 多线程与高并发(三)synchronized关键字

    上一篇中学习了线程安全相关的知识,知道了线程安全问题主要来自JMM的设计,集中在主内存和线程的工作内存而导致的 […]...

  8. Java中的多线程你只要看这一篇就够了

    如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一 […]...

随机推荐

  1. pandas常用操作

    数据导入和导出 # 导入 pd.read_csv("z:/data.csv", low_memory=True […]...

  2. .net core 单元测试之 JustMock第二篇

    JustMock标记方法 上篇文章在举例子的时候使用了returns的标记方法,JustMock还有很多标记方 […]...

  3. php

    php操作数据库时,对查询方法返回的result的值进行获取1.mysql_fetch_row():返回一个索引数组,即从返回值你不能知道列(字段)名称,它只记录第几个字段的值是什么 (返回受影响行数)2.mysql_fetch_as...

  4. 从软件公司的异同点讲起,聊聊未来的程序员该如何选公司和谋规划

        过了年以后,新的一轮春招又要开始,于是一个迫切的问题就摆在广大计算机相关专业的毕业生面前,那就是,找工 […]...

  5. MySQL压力测试工具

    目录 一、使用MySQL本身的Mysqlslap工具 1.1 更改其默认的最大连接数 二、使用第三方sysbe […]...

  6. Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?

    在计算机的启动过程中,有几个物理内存相关的地址非常重要,这篇文章就从这个几个地址来入手,学习一下系统的启动过程 […]...

  7. Linux的内存分页管理

    内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存的物理特性出发,深入到内存管 […]...

  8. 小程序和公众号绑定(通过开放平台)

    申请开放平台 ,并绑定公众号和小程序 小程序授权登录获取unionID 公众号关注时获取unnionID,并查 […]...

展开目录

目录导航