从Android面试题目溯源-1、创建线程有那几种方式

概念

程序执行流的最小单位,处理器调度调度和分派的基本单位。

如何理解这个概念

如下图,可以简单类比吉他,六根弦代表六个线程,每个线程独立且单独运行,且持有上一个音的状态,每根手指可类比为一个CPU的核心,在Arm架构中,大小核架构可以类比吉他的高底音弦,震动频率高的1,2,3弦为大核,震动频率相对较低的4,5,6弦为小核(之后针对Arm架构单独讨论)

jacek-dylag-hUHzaiAHuUc-unsplash.jpg

Java的创建方式

  1. 继承Thread
  2. 实现Runnable
  3. 匿名内部类实现Runnable接口
  4. 使用Callable和Future创建有返回值的线程

延伸

Dart如何创建并管理线程

Dart线程模型基于事件循环(event loop)和异步编程的理念,通过Steam和Future类型来支持异步编程。真正意义上的线程被称为Isolate,对应Java意义上的线程,我们可以简单类比Android的Handler-Looper机制为展开版本的async, await,Future异步模型,两者都是基于事件循环,同样的模式,在kotlin等其他语言中可能被称为协程

Rust如何创建并管理线程

  1. 使用std::thread::spawn函数
  2. 使用std::thread::Builder

Linux编程中线程的概念

当我们将目光深入到Linux系统中,我们会发现Linux系统使用轻量级进程(LWP,Lightweight Process)的线程模型来实现多线程,怎么来理解这句话,首先是和进程类似,或者说包含进程的性质的同时,又是轻量级,从具体实现上,我们知晓轻量是指,共享进程的资源(地址空间,文件描述符和其他操作系统资源)。

  • pthread_create创建线程
  • pthread_exit退出线程
  • pthread_cancel取消线程

我们从Linux的编程的概念当中可以看出,虚拟机线程的实现是依赖于操作系统的实现,大部分情况下,语言创建线程对应操作系统的线程,他们有对应关系。

Linux操作系统如何创建线程

计算机组成原理中,我们知晓计算机基本构成,CPU负责计算,内存负责存储计算数据,在Arm架构中,RISC(精简指令集)使用的便是load/save内存操作模型,计算机数据特定的约定可以解释为特定的含义。我们带着这个观点去查看一下Linux使用Syscall(系统调用)创建线程的过程。

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

void child_function(void *arg) {
    // 新线程执行的代码
    printf("Child thread: %s\n", (char *)arg);
}

int main() {
    // 创建一个新的栈空间
    char stack[4096];
    
    // 使用 clone 系统调用创建新线程
    int flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS;
    pid_t child_pid = clone(child_function, stack + sizeof(stack), flags, "Hello from child thread");

    if (child_pid == -1) {
        perror("clone");
        exit(EXIT_FAILURE);
    }

    // 主线程执行的代码
    printf("Main thread\n");

    // 等待新线程结束
    waitpid(child_pid, NULL, 0);

    return 0;
}

我们看到通过系统调用clone, 我们得到一个新的,栈大小为4096个字节的线程,新线程栈底部方法是child_function, 其中,创建线程的参数flag 表示共享的资源,例如虚拟内存空间CLONE_VM

总结

回到面试题,线程的创建和管理是开辟一个新的方法栈空间,执行新的函数调用。最初的原因是 IO性能远远低于CPU处理性能,在客户端上的体现是不耗时操作不阻塞主线程(UI线程)给用户提供流畅的体验,近些年来,协程的出现,本质上是Event Loop + 异步编程,轻量级的协程,优化的事件队列,比如Flutter实现的EventLoop由两部分组成。

  • 事件队列(Event Queue),存储异步事件
  • 微任务队列(Microtask Queue)存储立即执行的异步事件

这些方式都非常适合客户端提高流畅性和响应速度,可以多使用协程等类似的手段处理小并发问题,性能上会优于使用线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/199472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#开发的OpenRA游戏之属性SelectionDecorations(12)

C#开发的OpenRA游戏之属性SelectionDecorations(12) 前面分析了显示选择框的指示器类SelectionBoxAnnotationRenderable,它的作用就是画一个四个角的方角。 这个类是在属性SelectionDecorations里调用的,如下: protected override IEnumerable<IRenderable> Rende…

企业如何选择安全又快速的大文件传输平台

在现代信息化社会&#xff0c;数据已经成为各个行业的重要资源&#xff0c;而数据的传输和交换则是数据价值的体现。在很多场合&#xff0c;企业需要传输或接收大文件&#xff0c;例如设计图纸、视频素材、软件开发包、数据库备份等。这些文件的大小通常在几百兆字节到几十个字…

交流负载的原理与应用

交流负载是指能够消耗交流电能的设备或系统&#xff0c;在电力系统中&#xff0c;交流负载是不可或缺的一部分&#xff0c;它们将电能转化为其他形式的能量&#xff0c;以满足人们生产和生活的需求。交流负载的原理与应用涉及到许多方面&#xff0c;包括电气工程、电子技术、自…

数据库系统概述之国产数据库

当今世界&#xff0c;数据已成为重要的生产要素&#xff0c;数据库管理系统更是广泛应用于信息化行业各领域&#xff0c;国内数据库产业能否健康可持续的发展&#xff0c;在很大程度上影响着国民经济发展和网络空间安全。 当前&#xff0c;国产数据库行业竞争非常激烈&#xf…

Docker 安装kafka 并创建topic 进行消息通信

Apache Kafka是一个分布式流处理平台&#xff0c;用于构建高性能、可扩展的实时数据流应用程序。本文将介绍如何使用Docker容器化技术来安装和配置Apache Kafka。 一、使用镜像安装 1、kafka安装必须先安装Zookpper 2、下载镜像 docker pull wurstmeister/kafka 3、查看下载…

万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC

@[toc] 万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文…

Leetcode—1670.设计前中后队列【中等】

2023每日刷题&#xff08;四十三&#xff09; Leetcode—1670.设计前中后队列 实现代码 erase(iterator position)在删除vector中的元素后&#xff0c;会将该元素的后面所有元素都往前挪一位。因此&#xff0c;原先的迭代器指向的元素就不是原来那个了&#xff0c;而是它的后…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

推荐一款好用的BMP转PNG工具BMP2PNG

推荐一款好用的BMP转PNG工具BMP2PNG 自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用&#xff0c; 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话&#xff0c;网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xf…

网络聊天室项目

服务器端 #include <myhd.h>//传输结构体 struct cli {char type; // L/C/Qchar name[20];char text[128]; }; int main(int argc, const char *argv[]) {if(argc!3){printf("请输入ip地址和端口号\n");return -1;}//1、创建用于通信的套接字文件描述符in…

Kubernetes Dashboard 涉及的一些常规技巧

Kubernetes Dashboard 提供了一个GUI形式的K8S集群管理工具&#xff0c;通过它我们能很容易的观察到集群资源消耗情况、服务器运行状态以及针对Pod的相关观察与操作&#xff1b; Dashboard 的相关配置 Dashboard 提供了通过配置启动命令行参数来控制其相关行为的能力&#xf…

Docker—共享应用程序

现在您已经构建了一个映像&#xff0c;可以共享它。要共享Docker映像&#xff0c;您必须使用Docker注册表。默认注册表是Docker Hub&#xff0c;是您使用的所有图像的来源。 Docker ID&#xff08;Docker标识&#xff09; Docker ID允许您访问Docker Hub&#xff0c;这是世界上…

Hive安装与配置

你需要掌握&#xff1a; 1.Hive的基本安装&#xff1b; 2.Mysql的安装与设置&#xff1b; 3.Hive 的配置。 注意&#xff1a;Hive的安装与配置建立在Hadoop已安装配置好的情况下。 hadopp安装与配置 Hive 的基本安装 从 官网 下载Hive二进制包&#xff0c;下载好放在/op…

Linux系统---环境变量+内核进程调度队列(选学)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、环境变量 1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如: 我们在编写CI/…

卓越进行时 | 西安交通大学校友莅临赛宁网安参观考察

近日&#xff0c;为了深入贯彻网络安全强国战略建设&#xff0c;积极发挥网络安全企业的先进作用&#xff0c;推动校企合作与协作共赢。西安交通大学领导携校友会来到赛宁网安网络安全卓越中心进行参观考察&#xff0c;为进一步的校企合作和产业孵化奠定基础。 活动期间&#…

Maven——Maven使用基础

1、安装目录分析 1.1、环境变量MAVEN_HOME 环境变量指向Maven的安装目录&#xff0c;如下图所示&#xff1a; 下面看一下该目录的结构和内容&#xff1a; bin&#xff1a;该目录包含了mvn运行的脚本&#xff0c;这些脚本用来配置Java命令&#xff0c;准备好classpath和相关…

C语言数据结构之顺序表(上)

前言&#xff1a; ⭐️此篇博文主要分享博主在学习C语言的数据结构之顺序表的知识点时写的笔记&#xff0c;若有错误&#xff0c;还请佬指出&#xff0c;一定感谢&#xff01;制作不易&#xff0c;若觉得内容不错可以点赞&#x1f44d;收藏❤️&#xff0c;这是对博主最大的认可…

C++基础 -10- 类

类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};

学生护眼灯怎么选?2023备考护眼台灯推荐

近期&#xff0c;许多“护眼台灯是否是智商税”的帖子频繁出现&#xff0c;引起了许多群众的关注&#xff0c;作为一名护眼台灯资深使用者&#xff0c;在这里声明一下&#xff0c;护眼台灯绝对不是智商税。护眼台灯是通过调节光线亮度和色温&#xff0c;降低蓝光辐射&#xff0…

ubuntu22.04新机使用(换源,下载软件,安装显卡驱动,锁屏长亮)

换源 国内有很多Ubuntu的镜像源&#xff0c;包括阿里的、网易的&#xff0c;还有很多教育网的源&#xff0c;比如&#xff1a;清华源、中科大源。推荐使用中科大源&#xff0c;快得很。 /etc/apt/sources.list编辑/etc/apt/sources.list文件, 在文件最前面添加以下条目(操作前…