两个概念
线程 : 就是进程中的一个执行单元 也可以叫执行路径
进程 : 正在运行的程序.当一个程序进入到内存中的时候 就有了一个进程
进程中至少有一个线程,可以有多个线程,我们把有个线程的程序叫多线程程序
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
进程>线程
一个程序至少有一个进程,而一个进程至少有一个线程.
面试题:进程和线程的区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式,进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径.线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些.但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程.
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成
总线程数<= CPU数量:并行运行
总线程数> CPU数量:并发运行
- 并发:一个处理器同时处理多个任务。
- 并行:多个处理器或者是多核的处理器同时处理多个不同的任务.
前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.
- 并发性(concurrency),又称共行性,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。
- 并行(parallelism)是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。
来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。
CPU: 在某一时刻上只能执行一个路径,但是在我们看来 CPU可以执行多个线程
因为 CPU在进行高速的切换.
两种调度方式
分时调用
抢占式调用 java
主线程 JVM开启的 每个线程 都有自己的栈空间 相当于执行路径
Thread 类
构造
Thread() Thread(String name) Thread(Runnable t) Thread(Runnable t, String name)
静态方法
static Thread currentThread() 返回正在执行的线程对象
static void sleep(long millis) 线程睡眠 放弃CPU执行资格和权利 醒了再去抢
方法:
getName() 获取线程名称
void setName(String name) 设置线程名称
开启线程的两种方式
1:继承Thread类
A:自定类继承Thread类
B:重写run方法
C:创建自定义类对象
D:调用start()方法
2:实现Runnable接口
A:自定类实现Runnable接口
B:重写run方法
C:创建自定义类对象
D:创建线程对象,并将自定义类对象当做参数传递
E:调用start方法
第二种更符合开发
1: 解决了单继承的局限性
2: 将线程对象和线程任务分离 解耦 降低耦合度
run start 区别
run 可以当做普通方法调用 跟以前的使用一样
start方法 是开启线程 JVM去调用了run方法执行 这个时候的run方法 线程做的任务代码
稍微 练一下 匿名内部类的方式开启线程
状态图 看一下
新建 就绪 运行 阻塞 死亡
多线程安全问题:前提
1:多线程程序
2:共享一个资源
3:对这个资源有写的操作
解决方式:
1:加上同步锁 同步代码块
synchronized(锁对象){
可能出现安全问题的代码;
}
锁对象: 可以是任意类型的对象
多个线程间必须使用同一把锁
2:同步方法
普通的同步方法 this
权限修饰符 synchronized 返回值类型 方法名(..){
可能出现安全问题的代码;
}
静态的同步方法 锁对象 类名.class
static synchronized
3:Lock 锁
lock()
unlock()
------有时间补充上------
死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。[2]
1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
线程池的原理 :
因为创建和销毁线程对象消耗资源太多.为了解决这个问题
有了线程池
想将线程池创建出来,里面配置了线程对象 也就是以后一直用这里的线程对象
不用再创建 和销毁 因为使用完毕 放回线程池中
需要就去取.
等待唤醒机制
------------网络编程-------------------
ip
端口号
UDP
特点: 传输快,容易丢数据
聊天室
TCP
特点: 传输稳定,数据安全
上传,下载
UDP TCP操作过程 知道了
UDP 发送端和接收端
TCP 客户端 和 服务器端