Java从入门到放弃 · 多线程详解(二)

399 阅读3分钟

“这是我参与8月更文挑战的第26天,活动详情查看: 8月更文挑战

前言

上篇(传送门)我们一起学习了线程和进程的区别,以及线程调度的概念,本篇我们就来学习如何创建多线程。

以下内容如有不正之处,欢迎掘友们批评指正!

多线程

Java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行体来代表这段程序流。

创建多线程的第一种方式:创建Thread类的子类

Java中通过继承Thread类来创建并启动多线程的步骤如下︰

  • 1.定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。

  • 2.创建Thread子类的实例,即创建了线程对象

  • 3.调用线程对象的start()方法来启动该线程 java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同一个优先级,随机选择一个执行 来看代码实现:

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("run-->"+i);
        }
    }
}
MyThread mt = new MyThread();
mt.start();
for (int i = 0; i < 20; i++) {
    System.out.println("main-->"+i);
}

图片.png

创建多线程第二种方法:实现Runnable接口

采用java.lang.Runnable也是非常常见的一种,我们只需要重写run方法即可。 步骤如下:

  • 1.定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  • ⒉.创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
  • 3.调用线程对象的start()方法来启动线程。

Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。

使用runnable接口和Thread还有些不同,咱们通过实例来看一下。

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("run-->"+i);
        }
    }
}
public static void main(String[] args) {
    MyRunnable mr = new MyRunnable();
    new Thread(mr).start();
    for (int i = 0; i < 20; i++) {
        System.out.println("main-->"+i);
    }
}

图片.png

Thread和Runnable创建多线程的区别

实现Runnapte接口创建多线程程序的好处:

  • 1.避免了单继承的局限性
    • 一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类实现了Runnable接口,还可以继承其他的类,实现其他的接口
  • 2.增强了程序的扩展性,降低了程序的耦合性(解耦)
    • 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
    • 实现类中,重写了run方法:用来设置线程任务
    • 创建Thread类对象,调用start方法:用来开启新线程
    因此在以后创建多线程时,我们应该尽量使用Runnable接口。

写在最后

好了,关于多线程创建的两种方法我们就一起学习到这里。如果觉得有帮助别忘了给个赞哦。