程序线程进程基础学习

1、进程:指运行中的程序,比如使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间、当使用微信,又启动了一个进程,操作系统将为微信分配新的内存空间。进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

2、线程:线程是由进程创建,是进程的一个实体 [一个进程可以拥有多个线程]

例:打开迅雷[启动一个进程],使用迅雷下载多个文件[一个进程可以拥有多个线程]

3、单线程:同一个时刻,只允许执行一个线程

4、多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口;一个迅雷进程,同时下载多个文件

5、并发:同一个时刻,多个任务交替执行,造成一种"貌似同时"的错觉,简单的说,单核CPU实现的多任务就是并发;

例:单核CPU同时处理qq和迅雷任务就是在不断的交替执行任务;这意味着CPU会在非常短的时间间隔内,交替地执行不同的任务。每个任务在执行一小段时间后(这个时间片通常非常短,可能是几毫秒到几十毫秒),CPU就会切换到另一个任务去执行,以此循环。由于这个时间片非常短,用户通常无法感知到这种切换,因此产生了多个任务“同时”运行的错觉,这就是并发。[实际上在任何给定时刻,CPU只能执行一个任务。]

6、并行:同一个时候;多个任务同时执行。多核CPU可以实现并行

例:也是同时处理qq和迅雷任务,但是并行是一个CPU去执行qq任务,另一个CPU去执行迅雷任务,这就实现了并行;在多核CPU上,如果系统、应用程序和操作系统都支持并行处理,那么多个任务(或线程)可以同时在不同的处理器核心上执行,从而实现并行处理。但具体到每个任务如何分配核心资源,则取决于多种因素。

注意:并发和并行有可能同时存在;例:并行过程中,其中一个CPU在执行多个任务[即并发],此时就是并发并行同时存在。

线程六大状态:

1、新建状态(NEW):

线程刚被创建,但尚未启动(即未执行线程的start()方法)。此时,线程处于初始化阶段,等待进一步操作以进入就绪状态。

2、可运行状态(RUNNABLE):

Runnable状态细化了两种状态[Ready(就绪状态)、Running(运行状态)] (算上细化的状态是七种状态)

Ready:线程已经准备好运行,但尚未被CPU调度执行。它位于可运行线程池中,等待操作系统的调度。一旦获得CPU执行权,线程将进入运行状态。

Running:线程正在执行,并且已经获得了CPU执行权。此时,线程正在执行其代码中的指令。

3、阻塞状态(BLOCKED):

线程在执行过程中遇到了某些阻塞情况,如等待I/O操作完成、等待获得某个锁等,从而暂停执行。在阻塞状态下,线程不会占用CPU资源,直到阻塞条件被满足或取消。

4、等待状态(WAITING):

线程通过调用某个对象的wait()方法或其他类似机制(如join()但不带超时参数的等待),进入等待状态。在等待状态下,线程不会占用CPU资源,并等待其他线程执行特定操作(如调用notify()或notifyAll()方法)来唤醒它。

5、定时等待状态(TIMED_WAITING):

线程通过调用sleep(long millis)方法、带有超时参数的join()方法、wait(long timeout)方法或其他类似机制,进入定时等待状态。与等待状态不同,定时等待状态会在指定的时间后自动醒来,或者在接收到唤醒信号时提前醒来。在定时等待状态下,线程同样不会占用CPU资源。

6、终止状态(TERMINATED):

线程的run()方法执行完毕,或者因为异常而终止执行,此时线程进入结束状态。一旦线程进入结束状态,它将不再占用任何系统资源,并且无法再次启动。

这七种状态共同构成了线程的生命周期,反映了线程从创建到销毁的整个过程。

死锁解决方法:

  1. 避免嵌套锁:尽量避免在一个锁定的代码块中请求另一个锁。如果必须这样做,确保锁定的顺序在所有线程中都是一致的。
  2. 使用锁超时:在尝试获取锁时设置超时时间,如果无法在规定时间内获取锁,则释放已持有的锁并稍后重试。
  3. 使用可中断的锁:使用支持中断的锁,以便在发生死锁时可以通过中断来解锁。
  4. 使用锁监视器或死锁检测工具:这些工具可以帮助识别死锁并提供解决方案。

释放锁 -> 下面操作会释放锁

1、当前线程的同步方法、同步代码块执行结束

2、当前线程在同步代码块、同步方法中遇到 break、return

3、当前线程在同步代码块、同步方法中出现了未处理的 Error 或 Exception,导致异常退出

4、当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,就会让当前线程暂停,并释放锁

不会释放锁的操作:

1、线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行,不会释放锁

2、线程执行同步代码块或同步方法时,其它线程调用了该线程得suspend()方法将该线程挂起,该线程不会释放锁

注意:编程时应避免suspend() 和 resume()来控制线程,因为方法不再推荐使用

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值