线程和进程的区别

进程和线程的区别
  1. 进程 : 系统分配资源的最小单位
  2. 线程 :系统的调度的最小单位 ;每一个进程至少含有一个线程,即主线程(系统级别的,c语言的主线程),但是java级别的主线程即main方法;
  3. 进程有自己的内存空间地址,而线程只独享指令流执行的必要资源,比如寄存器和栈
  4. 由于同一进程的各线程间共享内存和资源文件,可以不通过内核进行直接通信,减少资源的消耗
线程的优点
  1. 创建一个新的线程的代价比创建一个新进程小得多
  2. 与进程之间状态得切换相比,线程之间状态的转变需要操作系统耗费的资源要小的多
  3. 结束线程所需要的资源也比进程小的多
  4. 线程占用的CPU资源也比进程小的多
  5. 相比进程,可以充分利用多处理器的可并行数量
创建一个线程中使用start() 和 run() 两种方法的区别
  1. 代码行在那个线程执行,就由那个线程执行代码行。
  2. start() 方法启动的是这个线程,告诉系统调度本线程。并不会影响其他方法的调用。会向系统申请启动某个线程,如果该线程处于运行状态,会自动调run()方法。run()方法会通过Thread或Runnable类,定义要执行的任务代码。申请系统调度线程。
  3. 若是直接调用run(),这就只是作为main方法中普通方法的普通调用,会直接在main线程中运行。线程执行的任务。
多线程
多线程在什么场景下使用,以及多线程的优点和特性。
  1. 提高性能和效率,并发并行的执行代码。(有些代码串行执行耗时太长)。
  2. 遇到阻塞任代码,而导致后续代码无法去执行的时候。我们可以使用多线程,让后续代码不受阻塞代码的阻塞而去执行。
什么因素会影响多线程的效率
  1. 多线程的数量 。根据程序所需要的线程数量去设计多线程的数量
常用API
  1. 静态方法: 作用在当前代码行所在的线程,一般作用于当前线程。eg : activeCount(): 获取当前线程组中的,还存在的线程数量。currentThread() : 获取代码行当前线程。 interrupted() : 测试线程是否被打断 。sleep() : 当前线程休眠。单位为ms。yield() : 让当前线程让步(让步就是从运行态转变成就绪态,让出CPU资源)
  2. 实例方法:作用在调用的线程对象上。
### 线程进程区别详解 #### 1. 定义与包含关系 进程是一个独立的执行环境,拥有完整的资源分配,包括内存空间、文件描述符等。线程进程中的一个执行单元,多个线程可以存在于同一个进程中,并共享该进程的资源[^1]。每个线程是一个独立的执行流,能够单独参与CPU调度[^1]。 #### 2. 资源分配与共享 每个进程都有自己的独立资源,如内存空间文件描述符表。同一进程内的线程共享这些资源,这意味着它们可以访问相同的内存区域文件描述符[^1]。这种资源共享机制使得线程间的通信更为高效,但也可能引发线程安全问题。 #### 3. 创建与销毁开销 创建销毁一个进程的开销较大,因为需要分配释放独立的资源。相比之下,线程的创建销毁开销较小,因为它只需在现有进程中分配少量资源[^2]。以下是使用Python创建线程的一个示例: ```python import threading def task(): print("线程任务执行中") thread = threading.Thread(target=task) thread.start() ``` #### 4. CPU调度与执行效率 由于线程共享进程的资源,切换线程的开销小于切换进程的开销。因此,在多线程环境中,CPU调度线程的效率更高,尤其是在需要频繁切换任务的情况下[^3]。 #### 5. 并发性与安全性 尽管线程间的通信更高效,但这也增加了线程安全问题的可能性。如果多个线程同时访问修改共享资源,可能会导致数据不一致或竞争条件[^1]。为了解决这一问题,通常需要使用锁或其他同步机制来保护共享资源。 #### 6. 异常处理 当一个进程中的某个线程抛出异常时,可能会导致整个进程中的所有线程都被终止。这是因为线程共享进程的资源,一旦资源被破坏,所有线程都会受到影响[^1]。而进程之间的隔离性更强,一个进程的异常通常不会影响到其他进程。 #### 7. 应用场景 对于需要大量资源隔离的任务,通常使用进程模型。而对于需要高效通信协作的任务,线程模型更为合适[^1]。 ### 示例代码:多线程并发执行 以下代码展示了如何通过多线程实现并发任务执行: ```python import threading import time def count_down(name, delay): counter = 5 while counter: time.sleep(delay) print(f"线程 {name}: 倒计时 {counter}") counter -= 1 thread1 = threading.Thread(target=count_down, args=("A", 1)) thread2 = threading.Thread(target=count_down, args=("B", 0.5)) thread1.start() thread2.start() thread1.join() thread2.join() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值