多线程基础知识点
########—多线程大纲—############################
1.实现线程方式:【继承Thread类、实现Runnable接口 】
2.静态代理设计模式
3.jdk1.8 lambda表达式
4.线程状态
5.线程优先级
6.守护线程。
7.Thread线程类的常用方法。
8.线程的同步、非同步
9.并发容器。
10.死锁。
########—多线程知识点—##############################
1.实现线程方式:【继承Thread、实现Runnable接口 】
① 继承Thread ,实现run()方法。
Thread使用: MyThread myThread = new MyThread(); myThread.start();
Thread特点:
② 实现Runnable接口,并重写run()方法【常用】
Runnable使用:new Thread(new MyRunnable()).start();
Runnable特点: 方便资源共享 | 避免单继承 |
③ Callable ,并重写call()方法【高级并发juc部分】
2.静态代理设计模式
- 公共接口:
- 真实角色:实现公共接口
- 代理角色:实现公共接口,传入真实角色,根据真实角色调用对于的方法。
3.jdk1.8 lambda表达式
- 推到:【静态内部类–》局部内部类–》匿名内部类。–》jdk1.8 lambda表达式】
- 对匿名内部类简化。用于简单的线程体。new Thread(()->{System.out.println(“线程体run方法中的实现体。”)}).start();
*lambda表达式案例:
public class Lambda1 {
public static void main(String[] args) {
Add add = (a,b)->a+b;
int a = add.AddTO(10, 23);
System.out.println(a);
}
}
interface Add{ public int AddTO(int a,int b); }
4.线程状态
*新生状态:Thread thread = new Thread();
*就绪状态:thread.start(); 解除阻塞; yield()【进入就绪状态】; jvm调用到;
*运行状态:获取CPU资源。
*阻塞装态:sleep【 占用资源->时间到家就进入就绪状态 】 ; wait【不占用资源】; join【插队线程,等待其他线程执行完才可以执行自己线程】; read\wait【操作系统去调用】;
*死亡状态:stop;【不推荐】; destroy;【不推荐】; 说明:一般运行完或是外部通过控制使线程停止。
5.线程优先级
- NORM_PRIORITY 5默认 | MIN_PRIORITY 1 | MAX_PRIORITY 10
- 获取线程优先级: Thread.currentHread().getPriority();
- 设置优先级:thread.setPriority(Thread.MIN_PRIORITY);
6.守护线程【】。
*设置线程为守护线程
Thread t = new Thread(new God());
t.setDaemon(true); //设置为守护线程
t.start();
7.Thread线程类的常用方法。
- Thread.currentThread().isAlive();//是否存活
- Thread.currentThread():当前线程
8.线程的同步、非同步
*使用synchronized来实现并发控制:
同步方法 public syncronizde void method(int ages){…}
同步块:synchronized(obj){…}
- ① 练习购电影票 ② 练习购火车票
9.并发容器
- CopyOnWriteArrayList容器里面自带并发同步锁: CopyOnWriteArrayList list = new CopyOnWriteArrayList();
10.死锁
- 过多的同步,会出现死锁。一般同步中持有多个对象锁。
- 避免死锁:不要在同一个代码块中,同时持有多个对象的锁。
- 写一个死锁案例。如:口红和镜子。
11.并发协作,生成者消费者模式。
*管程法【容器】:多线程生成者| 多线程消费者| 缓冲区| 数据【馒头】
*信号灯法【标志符】:
*Java中Object提供了:
wait()【导致当前线程等待,调用notify或notifyAll才会释放】 、wait(long timeOut)【导致当前线程等待一定时间】 、
notify()【】、 notifyAll()【】
12.多线程高级主题
多线程,定时调度:Timer TimerTask
quartz【任务框架】
HappenBefore【指令重排】
—————————————————————————
volatile【用于保证数据的同步,也就是可见性。但不保证原子性,轻量级synchronized 。volatile可以避免指令重排】
————————————————
dcl单列模式【 双重验证+volatile避免指令重排 】
————————————————
ThreadLocal【可以为每个线程分配独立的空间。有get/set/initialVaule 方法】
InheritableThreadLocal【继承上下文环境的数据,找起点】
——————————————————————
可重入锁原理实现【可以延续使用+计算器】
—————————————
CAS【比较并交换 AtomicInteger stock = new AtomicInteger(5); 】