目录
一、线程(Thread)的概念
二、线程存在的意义
2.1 并发编程
2.2 比进程更“轻量”
三、使用线程时应该注意
四、进程和线程的区别
五、Java中的线程和操作系统中的线程是不同的概念
六、多线程编程
一、线程(Thread)的概念
线程是操作系统中实现并发编程的一种基本结构。 |
线程可以被看作是运行在操作系统中的一个独立的工作单元,⼀个线程就是⼀个 "执行流"。 |
每个线程之间都可以按照顺序执行自己的代码。多个线程之间 "同时" 执行着多份代码。 |
线程的创建和执行由操作系统负责管理,程序员只需要提供线程执行的任务。 |
一个进程中可以有多个线程。每个线程也是由一个进程控制块(PCB)进行描述的。 |
阅读指针 -> 《什么是进程控制块(PCB Process Control Block)?》
<JavaEE> 什么是进程控制块(PCB Process Control Block)?-CSDN博客文章浏览阅读23次。介绍进程控制块和进程控制块的核心属性。进程控制块适用于进程,也适用于线程。https://blog.csdn.net/zzy734437202/article/details/134583750
二、线程存在的意义
2.1 并发编程
线程可以提高程序的并发性能,充分利用多核CPU的资源。 |
特别是在处理I/O密集型任务时,有些场景需要等待IO,在等待IO时,可以将系统资源调度给其他任务使用。 |
当程序需要执行多个任务时,线程可以同时处理这些任务,从而提高程序的执行效率。 |
2.2 比进程更“轻量”
进程也可以进行并发编程,但线程比进程更轻量,线程在创建、调度和销毁上,都要比进程快。 |
所以线程可以减轻CPU的负担,提高程序的响应速度。 |
线程保持了独立调度执行,支持并发的同时,省去了“分配资源”和“释放资源”带来的额外开销。这意味着只有在第一个线程,也就是进程创建时才需要申请系统资源,后续线程的创建则不再需要重新申请系统资源了。 |
三、使用线程时应该注意
注意以下几点 | 说明 |
线程并非越多越好 | 线程数量太多时,会加剧线程间对有限的CPU资源的竞争,这增加了资源调度的开销,降低了执行效率。 |
资源共享存在副作用 | 进程和进程之间不会互相影响,但如果同一个进程中的某一个线程抛出异常,这个进程中的其他线程也会受到影响,这就可能导致整个进程异常终止。 |
线程安全问题 | 线程之间可能互相干扰冲突,导致代码出现逻辑错误。线程安全问题也是并发编程的重点和难点。 |
四、进程和线程的区别
(1)进程包含线程。每一个进程至少有一个线程,这个线程被称为主线程。 |
(2)进程和进程之间不共享内存空间,每个进程都有自己的资源。同一个进程的线程之间共享同一分资源,如内存空间、文件描述符表等,每个线程都是一个独立的执行流,单独参加到CPU的调度中。 |
(3)进程是系统分配资源的最小单位,线程是系统调度的最小单位。 |
(4)一个进程发生异常一般不会影响到其他进程。但是一个线程出现异常,则可能导致同进程内的其他线程也发生异常,最终可能导致包含这个线程的进程也出现异常。 |
五、Java中的线程和操作系统中的线程是不同的概念
操作系统中的线程 | 线程是操作系统中的概念。操作系统内核实现了线程机制,并对用户岑提供了供用户使用的线程相关API。 |
Java中的线程 | Java标准库中的Thread类是对操作系统提供的API进行了进一步的抽象和封装。 |
六、多线程编程
多线程程序和非多线程程序的区别和优势在于,多线程每个线程都是一个独立的执行流,多个线程可以并发执行,增加了程序运行速度,提高了程序的运行效率。 |
许多语言都是支持多进程并发编程,也支持多线程并发编程。但是,在Java中,更鼓励多线程并发编程。 |
因为在Java标准库中,很多多进程编程的相关API都没有提供,而多线程编程的API都有封装提供。 |
更重要的是,在Java中每启动一个进程,就要启动一次Java虚拟机,这加大了多进程编程的系统开销。 |
因此在Java中,更推荐多线程并发编程。 |
阅读指针 -> 《介绍 线程类 Thread 》
链接生成中.........