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

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的单继承局限性
  • 适合多个相同程序的代码去处理同一个资源的情况,把线程、程序的代码和数据有效分离,较好的体现了面向对象的设计思想
posted @ 2022-10-14 20:58  青弦c  阅读(25)  评论(0)    收藏  举报