当前位置: 首页 > article >正文

深入Android架构(从线程到AIDL)_07 线程(Thread) 概念

目录

1、 线程(Thread)概念

2、 Java的线程框架


1、 线程(Thread)概念

  • 所谓线程(Thread) 是指一串连续的执行动作,以达成一项目的。
  • 現代的电脑内部都有数串连续性的动作同时在进行。也就是有多条线程并行地(Concurrently)执行。
  • 在电脑中,若电脑拥有多颗CPU,则每颗CPU 可各照顾一个线程,于是可多个线程同时间进行。若只有单一CPU,则此CPU可同时(Concurrently)照顾数个线程。
  • 无论是多CPU或单一CPU的电脑,多条线程并行地执行, 都可增加执行效率。
  • 像Java、 C++等现代的电脑语言都能让程序师们能够易于创建多条线程减化GUI 动画的设计工作,也可增加其执行效率。
  • 例如,当您想一边看动画,一边听音乐时,计算机能同时产生两个线程──“秀动画”及“播音乐”。甚至可产生另一条线程来为您做特殊服务,如让您可选择动画及音乐。
  • 多条线程能并行地执行同一个类别,或者是不同的类别。
  • 在Android平台里也不例外,无论是在Java层或是C++层,都常常见到多条线程并行的情形。
  • Android采取Java的Thread框架,来协助建立多條线程並行的环境。
  • 在Java里,大家已经习惯撰写一个类别来支持Runnable接口,再搭配Thread基类就能顺利诞生一个新线程来执行该类别里的run()函数了。

2、 Java的线程框架

  • Java提供一个Thread基类(Super Class)来支持多线程功能。这个基类协助诞生(小)线程,以及管理(小)线程的进行,让电脑系统更容易取得程序师的指示,然后安排CPU来运作线程里的指令。
  • 例如,线程所欲达成的任务(Task)是程序师的事,所以程序师应填写线程里的指令,来表达其指示。
  • 为配合此部份的运作, Java提供了Runnable接口,其定义了一个run()函数。
  • 于是,程序师可撰写一个应用类别(Application Class)来实作(Implement)此界面,并且把线程的任务写在应用类别的run()函数里,如此即可让(小)线程来执行run()函数里的任务了。
  • 这是几乎每一位Java开发者都常用的多线程(Multi-thread)机制,只是许多人都会用它,却不曾认识它的真实身影:就是一个幕后的框架。由于Android应用程序开发也采用Java语言,所这个Thread框架也成为Android大框架里的一个必备元素。
  • 基于这个框架里的Thread基类和Runnable接口,你就可以撰写应用类别,来实作run()函数了,如下图:
  • 于此图里,框架的Thread基类会先诞生一个小线程,然后该小线程透过Runnable接口,调用(或执行)了Task类别的run()函数。
  • 例如,请看一个Java程序:
    // Ex01-01.java
    class Task implements Runnable {
        public void run() {
            int sum = 0;
            for (int i = 0; i <= 100; i++)
                sum += i;
            System.out.println("Result: " + sum);
        }
    }
    
    public class JMain {
    public static void main(String[] args) {
        Thread t = new Thread(new Task());
        t.start();
        System.out.println("Waiting...");
        }
    }

  • 此时, main()先诞生一个Task类的对象,并且诞生一个Thread基础的对象。接着,执行到下一个指令: t.start();

  • 此时, main()就调用Thread的start()函数;这start()就产生一个小线程去执行run()函数。如下图:

           

  • 就框架的结构而言,上图里的Runnable接口与Thread基类是可以合并起来的。也就是把run()函数写在Thread的子类别里。如下图:
  • 兹撰写一个Java程序(即改写上述的Ex01-01.java)来实现上图:
    class myThread extends Thread {
        public void run() {
            int sum = 0;
            for (int i = 0; i <= 100; i++)
                sum += i;
            System.out.println("Result: " + sum);
        }
    }
    
    public class JMain {
        public static void main(String[] args) {
            Thread t = new myThread();
            t.start();
            System.out.println("Waiting...");
        }
    }
  • 其诞生一个myThread对象,并且由JMain调用Thread的start()函数。这start()就产生一个小线程去执行 myThread子类别里的run()函数。上图是类关系图,其对象关系图,可表示如下:

        


http://www.kler.cn/a/466390.html

相关文章:

  • 利用Claude3.5点评学习LightRAG源码
  • css中的渐变
  • 学技术学英文:Tomcat的线程模型调优
  • 基于 GitHub API 的 Issue 和 PR 自动化解决方案
  • ArcGIS API for JavaScript 缓冲区分析、河涌关联分析、集中连片分析
  • 高速网络数据包处理中的内核旁路技术
  • Ae 效果详解:漩涡条纹
  • .NET 8 + Ocelot + Consul 实现代理网关、服务发现
  • 365天深度学习训练营:第N1周:one-hot编码案例
  • 【Unity3D】LOD Group 多细节层次(CrossFade淡出淡入效果)
  • java: JDK isn‘t specified for module ‘product-service‘问题解决
  • 大数据-269 实时数仓 - DIM DW ADS 层处理 Scala实现将数据写出HBase等
  • 阅读线程池源码中遇到的retry:
  • 密码学精简版
  • 打靶记录24——Presidential
  • 【JavaScript】变量-常量-数据类型-类型转换
  • 如何使用axios实现并发请求
  • 【漫话机器学习系列】033.决策树回归(Decision Tree Regression)
  • 移动构造函数详解
  • MySQL使用通用二进制文件安装到Unix/Linux