多线程学习笔记
多线程
进程与线程
进程是执行程序的一次执行过程,是系统资源分配的单位
一个进程可以包含若干个线程,一个线程至少包含一个线程。线程是cpu调度和执行的单位。线程开启不一定立即执行,由CPU调度
线程三种创建方式
- Thread class 继承Thread 类
- Runnable接口 实现Runnable接口
- Callable接口 实现Callable接口
继承Thread类
- 子类继承Thread类具备多线程能力
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
实现Runnable接口
- 实现Runnable具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
StartThread4 station =new StartThread4();
//多个代理
new Thread(station,"小明").start();
new Thread(station,"小红").start();
new Thread(station,"小黑").start();
new Thread(station,"小王").start();
- 多个线程操作同一资源的情况下,线程不安全,数据紊乱。
静态代理模式总结:
真实对象和代理对象都要实现同一个接口
代理对象要代理真实角色
好处:
代理对象可以做很多真实对象做不了的事情
真实对象专注做自己的事情
Lambda表达式
like =() -> {System.out.println("---------");};
like.调用方法
new Thread (()->System.out.println("-----")).start();
总结:
1、lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行。那么就用代码块包裹
2、前提是接口为函数式接口
3、多个参数也可以去掉参数类型,要去掉就都去掉,加上括号
线程礼让
Thread.yield()
**礼让不一定成功,看CPU心情。 **
线程合并
**Thread.join() **
**Join合并线程,待此线程完成后,再执行其他线程,其他线程会阻塞 ,可以想象为插队 **
线程同步
-
为了保证数据再方法中被访问时的正确性,在访问时加入锁机制**synchronized **,当线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可,存在以下问题:
-
一个线程持有锁会导致其他所有需要此锁的线程挂起;
-
在多线程竞争下,枷锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题;
-
如果一个优先级高的线程等待一个优先级低的线程释放锁 会导致优先级倒置,引起性能问题。
同步方法
-
public synchronized void method(int args){}
同步块
synchronized(Obj){}
Obj称为同步监视器,推荐使用共享资源(增删改查的对象)作为同步监视器 。
死锁避免方法
- 产生死锁的四个必要条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
**只要破除其中任意一个条件就可以避免死锁发生 **
线程通信
**线程同步问题中,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件 **
-
对于生产者,没有生产产品之前,通知消费者等待,生产了产品后又需要通知消费者消费
-
对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费。
-
在生产者消费者问题中,仅有synchronized是不够的
- synchronized可阻止并发更新同一个共享资源,实现了同步
- synchronized不能用来实现不同线程之间的消息传递(通信)
-
Java提供了几个方法解决线程之间的通信问题
- wait() 表示线程一直等待,知道其他线程通知,与sleep不同,会释放锁。
- wait(long timeout)指定等待的毫秒数
- notify()唤醒一个处于等待状态的线程
- notifyAll()唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度。
都是Objec类的方法,都只能在同步方法活着同步代码快中使用,否则会抛出异常
lllegalMonitorStateException。
线程池
- ExcutorService:真正的线程池接口。
- void execute(Runnable command) :执行任务/命令,没有返回值,一般用来执行Runnable
Future submit(Callable task):执行任务,有返回值,一般用来执行Callable - void shutdown():关闭连接池
- Exectors:工具类,线程池的工厂类,用于创建并返回不同类型的线程池。

浙公网安备 33010602011771号