为了活动小家电-Android Thread和Handler(三)

90 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

为了活动小家电,接着上篇搞!

什么是线程?

  • 根据官方文档,java.lang.Thread是指在程序中执行的线程,在JVM的支持下,它是一个进程的组件,可以同时执行多个线程。

    线程是程序中的执行线程。Java 虚拟机允许应用程序同时运行多个执行线程。

  • 线程有时被描述为进程中的一个工作单元。

Thread 对象是如何创建的?

image.png

  • 根据上图,在Thread类的几个构造函数中,为了帮助理解,将根据有无Runnable参数将构造函数分成两部分来看。
  1. 第一种方法是使用默认构造函数 Thread() 构造函数创建一个线程。它通过在内部覆盖 run() 来使用。

  2. 第二种方法是使用 Thread(Runnable runnable) 构造函数创建一个线程。另外,应该创建和交付实现 Runnable 接口的对象。

    • 根据官方文档,实现Runnable接口的类应该定义为run()。换句话说,最好理解 Runnable 对象是一个具有 run() 内容的对象。 该Runnable接口应由其实例旨在由线程执行的任何类实现。该类必须定义一个没有参数的方法,称为run.作为参数传递的可运行对象在线程运行时使用。也就是说,当调用线程的 start() 时,会调用 runnable 的 run()。

Thread 对象是如何执行的?

  • 当 run() 在 Thread 中被覆盖时(第一种方法)

    • 当 start() 函数被执行时,线程的 run() 被 JVM 调用。

      使该线程开始执行;Java 虚拟机调用run该线程的方法。

      • Thread.start() -> Thread.run()
    • new thread().start();
      
    • 结果,两个线程同时运行。

      • 当前线程:一个 Thread 对象,它是 start() 的返回值
      • 另一个线程:执行上述线程的 run() 的另一个 Thread 对象
  • 使用 Runnable 时(第二种方式)

    • Thread 的 run() 内部调用 Runnable 的 run()。

      • Thread.start() -> Thread.run() -> Runnable.run()
    • new Thread(Runnable).start();
      

    如果该线程是使用单独的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,此方法不执行任何操作并返回。

    Runnable:启动此线程时调用其run方法的对象。如果null,这个类run方法什么也不做。

如何定义和使用线程?

  • 有两种方法可以直接定义和使用线程,具体取决于哪一种成为父级。

    • 如何继承和定义Thread类

      • class TestThread extends Thread {}
        
    • 如何通过实现Runnable接口来定义

      • class TestRun implements Runnable {}
        

        通过实例化一个实例并将自身作为目标传入,实现的类Runnable可以在没有子类化的情况下运行。

为了活动小家电,下篇继续搞!