线程和进程 亦凉 2023-10-01 21:23 5阅读 0赞 **目录** 一、线程和进程的区别 二、线程 三、分时操作系统 四、如何减少上下文切换 五、多线程和单线程 六、多线程的使用场景 -------------------- ## 一、线程和进程的区别 ## **线程**是调度的基本单位 **进程**是资源分配的基本单位 线程组成进程,进程包含线程,一个进程可以有多个线程,进程的规模大于线程 ## 二、线程 ## 我们一个类中的主方法就是主线程,主线程中可以包含多个子线程,各个线程没有包含关系,互相独立,互不依赖,如下 public class mTest { public static void main(String[] args) throws InterruptedException { System.out.println("主线程"); Thread t1 = new Thread(){ public void run(){ System.out.println("线程1"); } }; Thread t2 = new Thread(){ public void run(){ System.out.println("线程2"); } }; t1.start(); t2.start(); t1.join(); t2.join(); } } 线程.start() --> 使线程进入就绪态,并不是启动线程,线程什么时候启动要看CPU什么时候选择这个线程,看操作系统什么时候分配 线程.join() --> 让“主线程”等待“子线程”结束后继续运行 ![watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBAY3JhenlLLg_size_20_color_FFFFFF_t_70_g_se_x_16][] ![watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBAY3JhenlLLg_size_20_color_FFFFFF_t_70_g_se_x_16 1][] 两个子线程谁也没等谁,主线程总是先执行完的原因大概率是先执行的先结束 ## 三、分时操作系统 ## 当我们把上面的代码改动一下 public class mTest { public static void main(String[] args) throws InterruptedException { System.out.println("主线程"); Thread t1 = new Thread(){ public void run(){ while (true){ System.out.println("线程1"); } } }; Thread t2 = new Thread(){ public void run(){ while (true){ System.out.println("线程2"); } } }; t1.start(); t2.start(); t1.join(); t2.join(); } } ![bef0740e1fd2424286c349180f1aec36.gif][] 发现线程1和线程2交替执行 这是因为.start()方法将线程交给了分时操作系统执行,分时操作系统给每个进程分配了时间片,每个任务根据分配的时间片执行 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。 CPU通过时间片分配算法来循环执行任务当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。 ## 四、如何减少上下文切换 ## 减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程 1.无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据升时,可以用一下办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同线程处理不同段的数据 2.CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁。 3.使用最少线程:避免创建不需要的线程,必比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态 4.协程:在单线程里实现多线程任务的调度,并在单线程里维持多个任务间的切换 ## 五、多线程和单线程 ## 多线程有额外的CPU开销,所以多线程不一定会比单线程快 ## 六、多线程的使用场景 ## 需要多个任务同时进行 CPU有浪费时:网络爬虫、数据库操作 如往数据库中插入大量数据时,CPU在打空转时,把CPU改为多线程,一次性下达多指令,可减少CPU浪费 [watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBAY3JhenlLLg_size_20_color_FFFFFF_t_70_g_se_x_16]: https://img-blog.csdnimg.cn/3e269e22d3e24dc98c5a1a63f5da34e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAY3JhenlLLg==,size_20,color_FFFFFF,t_70,g_se,x_16 [watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBAY3JhenlLLg_size_20_color_FFFFFF_t_70_g_se_x_16 1]: https://img-blog.csdnimg.cn/cdb5281c67aa432093963ac62e4b1f92.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAY3JhenlLLg==,size_20,color_FFFFFF,t_70,g_se,x_16 [bef0740e1fd2424286c349180f1aec36.gif]: https://img-blog.csdnimg.cn/bef0740e1fd2424286c349180f1aec36.gif
相关 线程和进程 目录 进程 线程 实现多线程的方法 方式一:继承Thread类 设置和获取线程名称 线程调度 线程控制 线程的状态(生命周期) 方式二:实现Runnab 曾经终败给现在/ 2024年04月01日 01:38/ 0 赞/ 69 阅读
相关 线程和进程 一、概念: 进程:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。 线程:进程 刺骨的言语ヽ痛彻心扉/ 2024年03月27日 11:50/ 0 赞/ 61 阅读
相关 线程和进程 目录 一、线程和进程的区别 二、线程 三、分时操作系统 四、如何减少上下文切换 五、多线程和单线程 六、多线程的使用场景 -------------------- 亦凉/ 2023年10月01日 21:23/ 0 赞/ 6 阅读
相关 线程和进程 线程和进程 一、线程和进程 线程是CPU调度和分派的基本单位。 进程对于操作系统来说就是一个任务。 听起来挺难懂的一句话,我们举一个实际例子:比如现在有一条需要 迈不过友情╰/ 2023年05月29日 14:29/ 0 赞/ 5 阅读
相关 进程和线程 java_Java学习笔记:进程和线程 进程 进程:是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 线程 线程:是进程中的单个顺序控制流,是一条执行路径 单 我会带着你远行/ 2022年11月06日 00:55/ 0 赞/ 47 阅读
相关 进程和线程 1.概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位 我就是我/ 2022年07月16日 08:11/ 0 赞/ 238 阅读
相关 进程和线程 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内调度实体。比进程更小的独立运行 ╰半夏微凉°/ 2022年02月19日 21:13/ 0 赞/ 327 阅读
相关 进程和线程 进程和线程 开发工具与关键技术:java 撰写时间:2019/5/15 进程和线程 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间 ╰半夏微凉°/ 2022年01月31日 06:47/ 0 赞/ 257 阅读
相关 进程和线程 进程和线程 概念 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、 数据栈以及其他用于跟踪进程执行的 川长思鸟来/ 2021年10月30日 05:08/ 0 赞/ 405 阅读
相关 线程和进程 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它 红太狼/ 2021年06月24日 14:36/ 0 赞/ 520 阅读
还没有评论,来说两句吧...