Java线程启动为什么要用start()而不是run()?

目录
  • 1、直接调用线程的run()方法
  • 2、调用线程的start()方法
  • 3、总结

1、直接调用线程的run()方法

public class TestStart {
    public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(){

           @Override
           public void run() {
               System.out.println("Thread t1 is working..."+System.currentTimeMillis());
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       };
       t1.run();
       Thread.sleep(2000);
       System.out.println("Thread Main is doing other thing..."+System.currentTimeMillis());
    }
}

可以看到主线程在t1.run()运行之后再过三秒才继续运行,也就是说,直接在主方法中调用线程的run()方法,并不会开启一个线程去执行run()方法体内的内容,而是同步执行。

2、调用线程的start()方法

public class TestStart {
    public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(){

           @Override
           public void run() {
               System.out.println("Thread t1 is working..."+System.currentTimeMillis());
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       };
       t1.start();
       Thread.sleep(2000);
       System.out.println("Thread Main is doing other thing..."+System.currentTimeMillis());
    }
}

startVSrun1.JPG 可以看到在,在执行完t1.start()这一行之后,主线程立马继续往下执行,休眠2s后输出内容。 也就是说,t1线程和主线程是异步执行的,主线程在线程t1的start()方法执行完成后继续执行后面的内容,无需等待run()方法体的内容执行完成。

3、总结

  • 1、开启一个线程必须通过start()方法,直接调用run()方法并不会创建线程,而是同步执行run()方法中的内容。
  • 2、如果通过传入一个Runnable对象创建线程,线程会执行Runnable对象的run()方法;否则执行自己本身的run()方法。
  • 3、不管是实现Runnable接口还是继承Thread对象,都可以重写run()方法,达到执行设定的任务的效果。

到此这篇关于线程启动为什么要用start()而不是run()?的文章就介绍到这了,更多相关start()与run()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start() 和 run()相关源码(基于JDK1.7.0_40) start() 和 run()的区别说明start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run()   : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在

  • JAVA面试题 start()和run()详解

    问题 面试官:请问启动线程是start()还是run()方法,能谈谈吗? 应聘者:start()方法 当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.但是这并不意味着线程就会立即运行.只有当cpu分配时间片时,这个线程获得时间片时,才开始执行run()方法.start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体(真正的逻辑). 继承Thread类的启动方式 p

  • java thread start()和run()方法简析

    1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行. 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执

  • Java Thread中start()和run()的区别_动力节点Java学院整理

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

  • Java线程启动为什么要用start()而不是run()?

    目录 1.直接调用线程的run()方法 2.调用线程的start()方法 3.总结 1.直接调用线程的run()方法 public class TestStart { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(){ @Override public void run() { System.out.println("Thread t1 is working.

  • Java线程中的常见方法(start方法和run方法)

    目录 start方法和run方法 示例代码 注意 sleep方法与yield方法 sleep yield 线程优先级 sleep的应用-防止cpu占用100% join方法 有实效的等待 interrupt方法 打断正常运行的线程,不会清空打断状态 守护线程 start方法和run方法 $start()$方法用来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到$cpu$时间片,就开始执行$run()$方法.而直接调用$run()$方法,仅仅只是调用了一个类里的方法,其本质上还

  • Java 线程池原理深入分析

    Java 线程池原理 Executor框架的两级调度模型 在HotSpot VM的模型中,Java线程被一对一映射为本地操作系统线程.JAVA线程启动时会创建一个本地操作系统线程,当JAVA线程终止时,对应的操作系统线程也被销毁回收,而操作系统会调度所有线程并将它们分配给可用的CPU. 在上层,JAVA程序会将应用分解为多个任务,然后使用应用级的调度器(Executor)将这些任务映射成固定数量的线程:在底层,操作系统内核将这些线程映射到硬件处理器上. Executor框架类图 在前面介绍的JA

  • 了解Java线程池执行原理

    前言 上一篇已经对线程池的创建进行了分析,了解线程池既有预设的模板,也提供多种参数支撑灵活的定制. 本文将会围绕线程池的生命周期,分析线程池执行任务的过程. 线程池状态 首先认识两个贯穿线程池代码的参数: runState:线程池运行状态 workerCount:工作线程的数量 线程池用一个32位的int来同时保存runState和workerCount,其中高3位是runState,其余29位是workerCount.代码中会反复使用runStateOf和workerCountOf来获取run

  • 面试官问如何启动Java 线程

    目录 一.线程启动分析 二.线程启动过程 1. Thread start UML 图 2. Java 层面 Thread 启动 2.1 start() 方法 2.2 start0() 本地方法 3. JVM 创建线程 3.1 JVM_StartThread 3.2 JavaThread 3.3 os::create_thread 3.4 java_start 4. JVM 启动线程 4.1 Thread::start 4.2 os::start_thread(thread) 4.3 pd_sta

  • 面试官问如何启动Java 线程

    目录 一.线程启动分析 二.线程启动过程 1. Thread start UML 图 2. Java 层面 Thread 启动 2.1 start() 方法 2.2 start0() 本地方法 3. JVM 创建线程 3.1 JVM_StartThread 3.2 JavaThread 3.3 os::create_thread 3.4 java_start 4. JVM 启动线程 4.1 Thread::start 4.2 os::start_thread(thread) 4.3 pd_sta

  • Java中启动线程start和run的两种方法

    一.区别 Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程.但是无论哪种方法都可以通过start()和run()方法来启动线程,下面就来介绍一下他们的区别. start方法: 通过该方法启动线程的同时也创建了一个线程,真正实现了多线程.无需等待run()方法中的代码执行完毕,就可以接着执行下面的代码.此时start()的这个线程处于就绪状态,当得到CPU的时间片后就会执行其中的run()方法.

  • Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    本文实例讲述了Java线程操作的常见方法.分享给大家供大家参考,具体如下: 一 线程名称的操作 1 代码 public class GetNameThreadDemo extends Thread { public void run() { for( int i = 0; i < 5; ++i ) { printMsg(); try { Thread.sleep(1000); // 睡眠1秒 } catch( InterruptedException e ) { e.printStackTrac

  • Java线程让步_动力节点Java学院整理

    yield()介绍 yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! yield()示例 下面,通过示例查看它的用法. // YieldTest.java的源码 class ThreadA extends Thread{ public

  • 50 道Java 线程面试题(经典)

    下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要 100 毫秒,那么用十个线程完成改任务只需 10 毫秒.Java 在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很

随机推荐