多线程

多线程:
Process:进程
Thread:线程
继承了Thread就变成一个线程
说起进程不得不得说一下程序
程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念
进程:是执行程序的一次执行过程,他是一个动态的概念,是系统资源分配的单位
通常进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义,
线程:CUP调度和执行的单位
注意:很多多线程都是模拟出来的,真正的多线程是有多个CPU,即多核,如服务器,
如果模拟出来的多线程,即在一个CUP下,在同一时间点,CPU只能执行一个代码,因为切换很快,所以就有同时执行的错觉

线程核心概念:
线程就是独立的执行路径
在程序运行时,即使自己没有创建线程,后台也会有多个线程,如主线程,gc线程
main()称之为系统的主线程,为系统的入口,用于执行整个程序
在一个进程中如果开辟的多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的先后顺序是不能人为干预的
对同一份资源操作的时候,会存在资源抢夺的问题,需要加入并发控制
线程多带来额外的开销,如CPU调度时间,并发控制开销
每个线程在自己工作内存交互,内存控制不当会造成数据不一致。

继承 Thread类:
1.子类继承Thread具备多线程的能力
2.子类对象.start()启动线程
3.不建议使用因为oop是单继承局限性

实现Runnable接口:
1.实现接口Runnable具备多线程能力
2.传入目标对象加Thread.start()启动线程
3.推荐使用:避免单继承局限性,更加灵方便,方便同一个对象被多个线程使用
实现Callable接口:
1.实现Callable接口,需要有返回值
2.重写call方法,需要抛出异常

多线程五大状态:
1.创建状态:也就是 new的时候
2.就绪状态:也就是调用start()方法的时候
3.运行状态:也就是调用完start()方法之后等待CUP调度
4.阻塞状态:也就是之前调用的sleep()进去休眠状态也就进入阻塞了
5.死亡状态:线程结束

Thread.yield();//线程礼让 注意不一定会礼让成功
Thread.join();谁的线程调用了这个方法谁的线程就被插队

线程同步:
处理多线程问题时,多个线程访问一个对象,并且某些线程还想修改这个对象,这个时候我们就需要线程同步,线程同步其实就是一种等待机制,
多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕下一个线程在使用。

队列加锁才能保证线程同步的安全性
每个对象都有一把锁

synchronized 使对象具有排队型 上一个线程没有结束 下一个不会进入 注意哪个类的属性需要改变就锁哪个类的对象
synchronized(锁的对象){
里面是代码}

死锁:
多个线程各自占有一些资源,并且互相等到其他线程占有的资源才能执行,而导致两个或者多个线程都在等待对方资源的释放,都停止执行的情形,
某个同步块同时拥有"两个以上的锁时",就可能发生死锁的问题。
产生死锁的四个必要条件:
1.互斥条件;一个资源每次只能被一个程序使用
2.请求保持条件,一个继承因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件,进程已获得的资源,在未使用之前不能强行剥夺。
4.循环等待条件,若干进程之前形成一种头尾相接的循环等待资源关系。
注意我们只要避免其中的任意一个或者多个条件就可以避免死锁的发生

Lock和synchronized对比:
1.Lock显式的锁(可以手动开始锁和关闭锁,注意不要忘记关闭锁。)。synchronized是隐式的锁出了作用域就会自动释放
2.Lock只有代码块锁,synchronized有代码块锁和方法锁
3.使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的子类,比如ReentrantLock可重复锁)。
4.优先使用顺序:
Lock>同步代码块(已经进入方法体,分配了相应的资源。)>同步方法(在方法体之外)
线程协作(生产者消费模式):生产者消费模式是一个问题并不是一个模式

使用线程池:
背景:经常使用创建和销毁,使用量特别大的资源比如并发情况下的线程,对性能影响很大。
思路:提前创建多个线程放入线程池中使用时直接获取,使用完毕放入池中。可以避免频繁创建销毁,实现重复利用,类似生活中的公共交通工具
好处:提高相应速度(减少了创建新线程的时间)
降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
便于线程管理()
corePoolSize:核心池大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保留多长时间后终止
线程的总结:
创建的三种方式:继承Thread,实现Runnable接口,实现Callable接口
posted @ 2021-12-07 20:02  码奴2002  阅读(68)  评论(0)    收藏  举报