一 . 进程和线程
1.进程
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
2.线程
是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少
有一个线程
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分
成若干个线程
总结:相当于是一个是一个人干一件事情和一群人干一件事情
二. 同步与异步&并行与开发
同步:排队执行,效率低但是安全。
异步:同时执行,效率高但是不安全。
例子:好比一堆人来吃一锅饭 ,一个一个排队吃很安全,但是吃的就满了然后一堆人一块吃很快就解决完了 , 但是容易打架不安全。
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻发生(同时发生)。
三. 多线程 继承Thread
程序启动-->main线程开启-->main方法执行-->创建对象同时m线程开启-->同时开始工作运行到结束-->程序结束
四. 实现实现Runnable
执行时是交替执行的
五. 设置和获取线程名称
通过
Thread.currentThread().getName()来获取此线程的名称Thread.currentThread().setName()设置名称
六 . 线程的休眠
七. 线程的中断
给这个线程打一个中断标记 当线程发现中断标记就会自动死亡。
也可以设置为守护线程 当主线程结束后 守护线程也会死亡
2.守护线程
t1.setDaemon(true)在启动前
进行这些操作时会触发InterruptedException 有中断标记是由程序员决定他是否死亡
八.线程安全问题
1.线程不安全
进入循环后 当第一个线程经过睡眠后第二第三线程已经进入循环所以线程不安全会出现余票-1,-2的结果
线程不安全解决方式(三种方法默认的都是不公平锁)
1.同步代码块
synchronized (o)加锁 注意 要看同一把锁
2.同步方法
public synchronized boolean sale()把if()抽成同步方法
3.显示锁
给任务一把锁 lock.lock();加锁 lock.unlock();解锁
九. 线程死锁
一个警察于罪犯的故事:两个人刚开始都说了一句话 警察在等罪犯往下说 罪犯在等警察 形成死锁
双方都有一个说话的方法 然后警察调罪犯 罪犯调警察 相互等待 线程死锁
十. 多线程通信的问题
厨师与服务员的故事:厨师做菜服务员端菜 一个做一个端 就得一个做完就休息唤醒另一个不然会乱套
十一 .线程的六个状态
先运行 然后执行 在执行过程中可能会等待 也可能会休眠 然后回到执行 最后结束
十二.带返回值的线程Callable
(第三种实现方式)像是主线程指派给他一个任务
十三. 线程池
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程
就会大大降低 系统的效率,因为频繁创建线程和销毁线程需要时间. 线程池就是一个容纳多个线程的容
器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
好处:
1.降低资源消耗
2.提高响应速度
3.提高线程的可管理性
1.缓存线程池
2. 定长线程池
第一个执行完等待你设定的秒数后接着往下执行
3.单线程线程池
4.周期任务 定长线程池
十四.Lambda 表达式
Thread t = new Thread(() -> { 表达块 });