多线程总结

1.什么是进程?
进程是系统进行资源分配和调用的独立单元,每一个进程都有它的”独立”内存空间和系统资源。
2.单进程操作系统和多进程操作系统的区别

单进程操作系统:DOS
多进程操作系统:
Windows
Mac
Linux( 多进程多用户操作系统
区别:
单进程操作系统必须一个一个任务去执行
多进程操作系统即可以操作任务1也可操作任务2...
3.现在的多核CPU是否可以让系统在同一个时刻可以执行多个任务吗?
理论是支持同一时刻执行多个任务

4.什么是线程,理解线程和进程的关系
线程理解:影分身
线程是进程里面的一条执行路径,每个线程同享进程里面的内存空间和系统资源
一个进程 -- 多线程:各个线程都有不同的分工
进程:进程之间的内存空间和系统资源是独立的
线程:线程之间是共享内存空间和系统资源的
进程里:可以有一条或一条以上的线程
进程里只有一条线程的情况下,这条线程就叫做主线程
进程里有多条线程的情况下,只有一条线程叫做主线程
Ps:线程是在进程里的,他们是包裹关系
子线程实例化必须放在主线程的前面,这样才能互相争抢资源,如果子线程放在主线程的后面,那就 相当于单线程,主线程执行玩,再执行子线程,子线程1+主线程+子线程2,子线程1和主线程相互争抢资源,只有当主线程执行完,再执行子线程2

6.Java中,如何来编写多线程的应用程序?有哪些方法?
创建子线程的方法:
1.创建线程类,继承Thread类,重写run方法
2.创建任务类,实现Runable接口,实现run方法 thread接收Runable对象(也就是Runable实现类的对象)
3.带有返回值的线程(下周一学习的内容,和线程池的知识点有点)

创建线程类和创建任务类线程的区别就是:1:创建任务类,每一个线程对象都共享一份线程类中的属性, :2: 创建线程类,那就是每一个线程对象都有一样的线程类中的属性,如果在属性前面加上static就和任务类一样了,(每一个线程对象共享一个静态属性)
经典面试题:
请问当我们编写一个单纯的main方法时,此时该程序是否为单线程的?为什么?
垃圾回收器也是一个线程
8.线程的优先级
通过测试发现: 优先级高的一般会优先执行,但只是概率性,不是绝对的
Thread.MAX_PRIORITY
Thread.MIN_PRIORITY
Thread.NORM_PRIORITY
my.setPriority(Thread.MAX_PRIORITY);

9.给线程自定义名称
细节:通过构造方法传参数来区别不同子线程名称
* 1. 在自定义线程类中声明属性来接收该名
* 2. 将线程名传给父类--->this.getName()去获取名称;Thread.currentThread().getName()

10.让线程休眠 sleep
注意:sleep方法是静态方法,直接用类名调用,关键是这个方法休眠的是哪个线程?(答:写在哪个线程,就休眠哪个线程)
重要知识点:
Thread.sleep() -- 休眠一定时间再执行下面的
Thread.wait() --- 等待
这两者从功能上说都是阻塞线程的, 唯一的区别是前者休眠不释放锁,后者释放
11.线程的礼让:正确理解线程的礼让,当前线程释放资源,之后又和其他线程重新争抢资源
注意: Thread.yeild()方法是静态方法,直接用类名调用,写在哪个线程,哪个线程就礼让
12.线程的合并:主线程和子线程同时运行,满足一定条件后,让子线程先运行至结束
my.join(); //my这个子线程插主线程的队,执行完再执行其他的
特点:真正能决定最终的结果,和优先级别不同
13.线程的中断
ThreadLocal 主要用来提供线程局部变量,也就是变量只对当前线程可见,
set()和get()修改和获取
my.interupt(); 中断线程,用在主方法中
Thread.interupted();放在线程中,两者共用,
执行到my.interupt()时,Thread.interupted()的返回值会变成true,默认是false

jvm--- -守护线程----一旦有垃圾内存,立马销毁;主线程结束,jvm也跟着停止(垃圾回收机制)
my.setDaemon(true); //设置守护线程,放在my.start()的前面,
//将子线程变为守护线程,默默为主线程服务,和主线程争抢资源;也就是主线程执行结束后,守护线程立即跟着结束


1.同步锁/互斥锁
重要概念:锁对象, 多个线程共用同一把锁,才能锁得住
常用锁对象:this、字面值常量、字节码文件、静态对象

2.3.死锁:锁嵌套的时候尤其要小心,要注意
多个线程去争抢多个资源,锁嵌套就容易出现死锁出现死锁的情况,设置两个锁对象A和B,设置2个代码块,线程1同时使用A对象的锁,线程2同时使用B对象的锁,然后线程1同时要使用B对象的锁,线程2同时要使用A对象的锁,这样就会出现死锁,每个人都有一个筷子,然后又要对方的筷子,这样就会僵持不下,出现死锁,

1.1同步代码块
语法:
synchronized(锁对象){//上锁
...代码块...
}//解锁
1.2同步方法
语法:
锁对象:this
public synchronized void method(){//上锁
...代码块...
}//解锁

2.Lock--接口
创建对象:Lock lock = new ReentrantLock();
上锁:lock.lock();
解锁:lock.unlock();
锁的应用:多个线程去操作同个数据时,考虑线程安全(锁)



5.线程池
ExecutorService: 线程池的服务接口
Executors:线程池的工具类
创建不同的线程池:
工具类.newSingleThreadExecutor():创建一个线程的线程池
工具类.newFixedThreadPool(3):创建指定个数线程的线程池,固定个数的线程处理多个对象
工具类.newCachedThreadPool():创建带有缓存的线程池(有一个任务如果没有空闲线程时就创建一个线程,线程空闲时间超过60秒就自动销毁)有多少个任务就有多少个现程对象
有多个线程时。while每个都要判断一次,if只判断一次
while一般放在synchronized的外边,如果放里面的话,永远只有一个线程执行
sleep()会释放锁,wait不释放锁

* 整理: 不安全效率高、单线程(倾向StringBuilder)
* 1. StringBuffer(安全) VS StringBuilder(不安全)没加锁
* 2. Vector(安全) VS ArrayList(不安全)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值