首页 > 其他分享 >run()和start()的区别

run()和start()的区别

时间:2022-08-24 19:25:22浏览次数:50  
标签:run 区别 start myThread 线程 方法 public

run()和start()的区别

什么是run()方法?

run()方法只是类的一个普通方法.

​ 如果直接调用run()方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run()方法执行完毕后才可以继续执行下面的代码.

public class template{
    public static void main(String[] args){
        Thread thread = new Thread(new myThread);
        thread.run();
        System.out.println("finish");
    }
}
class myThread implements Runable{
    @Override
    public void run(){
        System.out.println("myThread run start");
        try{
            Thread.sleep(5*1000);//等待5秒
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("myThread run end");
    }
}

​ 运行结果:

myThread run start
myThread run end
finish

什么是start()方法?

用start方法来执行线程,是真正实现了多线程.

​ 通过调用Tread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法.

​ 但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码.

public class template{
    public static void main(String[] args){
        Thread thread = new Thread(new myThread);
        thread.start();
        System.out.println("finish");
    }
}
class myThread implements Runable{
    @Override
    public void run(){
        System.out.println("myThread run start");
        try{
            Thread.sleep(5*1000);//等待5秒
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("myThread run end");
    }
}

​ 运行结果:

finish
myThread run start
myThread run end

启动线程是否可以直接调用run()方法?

image-20220824092328286

​ 如果直接调用线程类的run()方法,这会被当做一个普通的函数调用,程序中仍然只有主线程这一个线程,也就是说,start()方法能够异步地调用run()方法,但是直接调用run()方法确实同步的,因此,也就无法达到多线程的目的.

区别

  1. Run仅仅是执行了里面的代码逻辑,并没有新开一个线程

    start是新开了一个线程,然后在新的线程里面执行里面的逻辑

  2. 当一个线程启动后,不能重复调用start(),否则会报IllegalStateException异常.

    但是可以重复调用run()方法.

总结

1. start方法用来启动相应的线程
1. run方法只是thread的一个普通方法,在主线程里执行
1. 需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法
1. run方法必须是public的访问权限,返回类型为

标签:run,区别,start,myThread,线程,方法,public
From: https://www.cnblogs.com/bmmxz/p/16621277.html

相关文章

  • UVM在VCS中run时,碰到的error :The object at dereference depth 1 is being used befor
    VCSelab没有问题,再运行时碰到报错:Theobjectatdereferencedepth1isbeingusedbeforeitwas constructed/allocated. Pleasemakesurethattheobjectis......
  • @PathVariable和@RequestParam的区别 获取请求参数的四种方式
    @PathVariable和@RequestParam的区别获取请求参数的四种方式请求路径上有个id的变量值,可以通过@PathVariable来获取 @RequestMapping(value="/page/{id}",method......
  • mkdir()和mkdirs()的区别
    mkdir()和mkdirs()的区别本文内容主要整理自StackOverflow的问题:Differencebetweenmkdir()andmkdirs()injavaforjava.io.File[closed]问题起源最近在实......
  • postmapping和RequestMapping的区别
    postmapping和RequestMapping的区别@GetMapping用于将HTTPGET请求映射到特定处理程序方法的注释。具体来说,@GetMapping是一个作为快捷方式的组合注释@RequestMapping(......
  • 解释(Interpret)和编译(Compile)的区别
    计算机语言可以分为机器语言、汇编语言和高级语言高级语言会翻译成机器语言之后,才可以执行。而翻译的方式有两种,一种是解释(Interpret),一种是编译(Compile)。运行过程编译(Co......
  • 成员变量和局部变量的区别和面向对象的三大特征之封装性
    成员变量和局部变量的区别1、定义的位置不一样【重点】局部变量:在方法的内部成员变量:在方法的外部,直接鞋子类当中2、作用范围不一样【重点】局部变量:只有方法当中才可......
  • 关于CATALINA_HOME 和 CATALINA_BASE 的区别
    官方文档*以下内容从官方复制出来的*目录和文件这些是一些重要的tomcat目录:/bin-(启动,关闭和其他脚本)/conf-配置文件和相关DTD,这里最重要的文件是server.xml,它......
  • 内存管理——分段和分页的区别
    分段与分页的区别分段:分页:分段和分页的工作方式相似,都是非连续存储。分段的逻辑地址=段号+段内偏移。段表存放段描述符。段描述符=段基址+段界限。物理地址=段基址+......
  • MySQL 5.7 vs 8.0版本的性能有什么区别
    1、新增持久化设置MySQL8.0新增SETPERSIST的命令,该命令的配置值保存到数据目录下的mysqld-auto.cnf文件中,待重启后,读取该文件,用其中的配置覆盖缺省的配置文件,补充了SE......
  • Python 中 Iterator和Iterable的区别
    Python中list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么?因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少......