1.程序:
程序是存储在磁盘上,包含可执行机器指令和数据的静态实体(静态的代码)
2.进程:
是系统进行资源分配和调度的基本单位
3.线程:
是进程的一条执行路径,一个进程至少有一个线程,进程中的多个线程共享进程的资源
4.多线程:
* 在单个程序中同时运行多个线程完成不同的工作,称为多线程
* ①.用户向服务发起一个请求,服务器收到请求并作出响应结果就是一个多线程
* ②.客户端N多的请求同时去请求服务器,这是多线程。
* ③.线程的两种调度方式:抢占式调度和非抢占式调度(一般情况下都会使用抢占式)
5.进程和线程的区别:
* ①.一个程序至少有一个进程,一个进程至少有一个线程
* ②.线程的划分尺度小于进程,使得多线程程序的并发性高。
* ③.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,提高了程序的运行效率。
* ④.每个独立的线程都有一个程序的入口,但是线程不能够独立运行,必须依赖于进程
6.并行和并发
* 并发:①.一个处理器同时处理多个任务(一个人同时去吃三个馒头)
* ②.通过cpu算法调度,让用户看上去是同时进行,实际上不是真正的同时,并发强调在一个时间段同时执行
* 而一个时间段是有多个单位时间组成,所以说并发的多个任务在单位时间内不一定在同时进行
* 并行:①.多个处理器同时处理多个不同的任务(三个人同时吃一个馒头)
* ②.多个处理器或者多台机器同时执行一段处理逻辑,是真正的同时
7.为什么要使用线程:
* ①.提升cpu的计算能力,避免资源浪费
* ②.提高系统的响应速度(如果系统只有一个线程可以执行,那么当用户发出不同的请求时,由于上一个请求没有处理完成,必然在队列中等待)
8.共享资源
* ①.允许被不同的线程访问的资源
* ②.共享资源时多线程允许不止一个线程访问的类变量或者实例变量。
9.锁:
当多个线程共同使用同一个共享资源的时候,会出现资源争抢,锁就是来解决这种冲突保证线程有序使用共享资源。
10.线程安全
* ①.如果一段代码可以保证多个线程访问的时候正确操作共享资源,那么就是线程安全 的。
* ②.一个资源只可以被多个线程调用的情况,不会出现冲突就是线程安全的。
* ③.出现线程不安全的唯一因素:就是多个线程同时修改共享资源
11.线程分类
* 线程可以分为用户线程和守护线程
* ①.守护线程(daemon thread):是指在后台运行的贤臣个,用于提供后台服 务。
* ②.用户线程(user thread): java创建的线程默认是用户线程
* -- 两者的区别:
* ①.当进程中还有用户线程在运行时,进程不终止。
* ②.当进程中只有守护线程运行时,进程终止
12.线程的生命周期
* 当线程被创建启动之后,不是启动立刻进入执行状态,也不是一直处于执行状态,它要经历如下几个步骤:
* 新建(New) -- 就绪(Runnable) -- 运行(Running) -- 阻塞(Blocked) -- 死亡(Dead)
* ①.新建状态:当程序创建好一个线程后,该线程就处于新建状态,此时JVM为其分配内存。
* ②.就绪状态:当线程对象调用start()方法后,该线程就处于就绪状态,等待cpu调度运行
* ③.运行状态:已经开始执行run()方法的线程执行体,该线程处于运行状态,cpu已经调度执行
* ④.阻塞状态:当运行状态的线程失去所占资源后,就进入阻塞状态
* -- 当线程调用sleep()方法时主动放弃CPU资源
* -- 线程想要获取同步监视器的时候,此监视器正被其他线程所持有。
* -- 线程在等待某个通知(notify)
* ⑤.死亡状态:线程在run()方法执行结束进入死亡状态。此外如果线程执行了interrupt(),(stop 已弃用)那么也会进入死亡状态。
* 那么也会计入死亡状态
13.线程的通信
* ①.wait():令当前线程挂起并放弃cpu的控制权,使别的线程可以访问并修改共享资源。(等待)
* ②.notify():唤醒正在排队等待同步资源的线程。(单个线程)
* ③.notifyAll():唤醒正在排队等候资源的所有线程。(所有线程)
* -- 注意问题:
* ①.以上三个线程通信方法都不属于Thread类,是属于Object类,每个对象都拥有以上三个方法
* 因为每个对象都有锁,锁是每个对象的基础
* ②.当需要调用以上方法的时候,一定要对共享资源进行加锁,如果不加锁,则会引发IllegalMonitorStatteException异常
* ③.当想要调用wait()方法进行线程等待的时候,必须要取得这个锁对象的控制权(对象监视器),一般是放到synchronized(obj)代码块中
* ④.调用wait()方法是释放了对象的锁,否则其他线程是无法获得锁