首页 > 编程语言 >Java----实现多线程(初识)

Java----实现多线程(初识)

时间:2022-10-14 21:14:32浏览次数:49  
标签:Java Thread ---- start 线程 ThreadDemo01 new 多线程

Java----实现多线程(初识)

进程:正在运行的程序

  • 是系统进行分配和调用资源的独立单位
  • 每一个进程都有他自己的内存空间和系统资源

线程:是进程中的单个顺序控制流,是一条执行路径

  • 一个线程如果只有一条执行路径,那就称为单线程:记事本程序
  • 一个线程如果有多条执行路径,那就称为多线程:扫雷程序

多线程的实现方式:

方式一:继承Thread类

  • 定义一个MyThread继承Thread类
  • 在MyThread类中重写run()方法
  • 创建MyThread类的对象
  • 启动线程

两个小问题:

  • 为什么要重写run()方法呢?

​ 因为run()方法是用来封装被线程执行的代码

  • run()方法与start()方法的区别:

    ​ run():封装线程执行的代码,直接调用,相当于普通方法的调用

    ​ start():启动线程,然后由JVM(Java虚拟机)调用次线程的run()方法

代码实现:

public static void main(String[] args) {
        ThreadDemo01 td = new ThreadDemo01();
        ThreadDemo01 td2 = new ThreadDemo01();
//        td.run();
//        td2.run();

        td.start();
        td2.start();
    }

设置和获取多线程名称

方法一:Thread类中设置和获取多线程名称的方法:

  • void setName(String name):为此线程设置名称
  • String getName():返回此线程的名称

方法二:使用带参构造方法

  • 在自创的继承了Thread类的Java文件中写一个无参构造方法
  • 接着写一个带参构造方法(利用super()方法)
  • 直接在创建对象时命名

代码:

    public static void main(String[] args) {
        ThreadDemo01 td = new ThreadDemo01("一号机");
        ThreadDemo01 td2 = new ThreadDemo01("二号机");
//        td.setName("火车");
//        td2.setName("飞机");

        td.start();
        td2.start();
    }

方法三:利用Thread类中的静态方法

  • 利用静态方法::static Thread currentThread()返回对当前正在执行的线程对象的引用
  • 直接在输出时使用此方法

代码:

    public static void main(String[] args) {
        ThreadDemo01 td = new ThreadDemo01();
        ThreadDemo01 td2 = new ThreadDemo01();
//        td.setName("火车");
//        td2.setName("飞机");

//        td.start();
//        td2.start();
        System.out.println(Thread.currentThread().getName());
    }

线程调度

线程有两种调度模型:

  • 分时调度模型:所有线程轮流使用cpu的使用权,平均分配每个线程占用CPU的时间片
  • 抢占式调度模型:优先让优先级高的线程先执行,若优先级相同,则随机选择一个执行

Java中线程执行默认是第二个模型

抢占式调度模型的两个方法:

  • public final int getPriority()返回此线程的优先级

  • public final int setPriority()设置该线程的优先级

  • 注意:优先级高并不代表他一定先执行,只能说他占有的CPU时间片多

    ​ 线程优先级默认是5,最高是10,最低是1。

代码:

public static void main(String[] args) {
    MyThread01 mt1 = new MyThread01("火车");
    MyThread01 mt2 = new MyThread01("飞机");
    MyThread01 mt3 = new MyThread01("汽车");

    System.out.println(mt2.getPriority());
    mt1.setPriority(5);
    mt2.setPriority(10);
    mt3.setPriority(1);

    mt1.start();
    mt2.start();
    mt3.start();

}

线程控制

方法名 说明
static void sleep(long millis) 使当前正在执行的线程暂停执行指定的毫秒数
void join() 等待这个线程死亡(先让该线程执行完)
void setDaemon(boolean) 将这个线程标为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出(也就是说没有设置成守护线程的运行完后,被设置为守护线程的线程将停止运行)

线程的生命周期

image-20220809220233280

多线程的实现方式 (二)

实现Runnable接口

  • 创建一个MyRunable实现Runnable接口
  • 在MyRunnable中重写run()方法
  • 创建 MyRunnable类的对象
  • 创建Thread类的对象,把MyRunnable对象作为构造方法的参数
  • 启动线程

代码实现:

public static void main(String[] args) {
    MyRunable mr = new MyRunable();

    Thread t1 = new Thread(mr,"高铁");
    Thread t2 = new Thread(mr,"汽车");

    t1.start();
    t2.start();
}

多线程的实现方式有两种:

  • 继承Thread类
  • 实现Runable接口

相比继承Thread类,实现Runnable接口的好处:

  • 避免了java的单继承局限性
  • 适合多个相同程序的代码去处理同一个资源的情况,把线程、程序的代码和数据有效分离,较好的体现了面向对象的设计思想

标签:Java,Thread,----,start,线程,ThreadDemo01,new,多线程
From: https://www.cnblogs.com/change624/p/16793016.html

相关文章

  • UART学习笔记
    UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信......
  • Elasticsearch使用terms聚合之后进行分页排序
    引言elasticsearch中实现聚合也非常常见,同时es的数据量一般比较大,因此聚合结果比较多,像terms聚合默认只返回10条聚合结果,所以聚合之后进行分页,也是非常常见的操作。es的t......
  • python 文件的写操作
    1写操作快速入门打开文件f=open("python.txt","w")文件写入f.write("helloworld")内容刷新f.flush()注意:直接调用write,内容并未真正写入文件,而是会积攒在程......
  • Java----线程同步
    Java----线程同步案例:卖票要求:某电影院正在上映国产大片,它有100张票,而该电影院有三个窗口卖票,请设计一个程序模拟该电影院卖票思路:①定义一个类SellTicket来实现Runna......
  • MySQL----语言基础
    MySQL----语言基础语法特点SQL对关键字的大写不敏感SQL语句可以单行或者多行书写,以分号;结束。SQL的注释:--单行注释,--后面一定要加一个空格‘单行注释,可以不用加......
  • PostgreSQL----运行02_insert_data
    ALTERTABLEdepartmentsALTERCONSTRAINTdept_mgr_fkDEFERRABLEINITIALLYDEFERRED;BEGIN;INSERTINTOdepartmentsVALUES(10,'Adminis......
  • PostgreSQL----四个快速脚本
    PostgreSQL----四个快速脚本运行01_create_table.sql创建示例表;--部门信息表CREATETABLEdepartments(department_idINTEGERNOTNULL--部门编......
  • 2022-10-14
    30F:三笔,中枢构筑中  5F:已经2中枢,有背驰迹象,预计30F一笔将结束  计划:1.如果再次冲高,可空30F一笔2.等30F回调一笔,小级别入场做多......
  • 一本通数位DP小结(更新中)
    「一本通5.3例1」AmountofDegrees点击查看代码//先转化为前缀和//从头到尾枚举每一位:这一位的贡献为前面的位都相同,这一位比原来更小,后面的位任意的方案......
  • excel-分类汇总
    先看一张分类汇总的结果图,进而直观的理解分类汇总。解读:意义:按班级分类统计了各科成绩分数的平均值。关键内容:分类字段:班级汇总字段:语文、数学、英语、生物、地理、历史、政......