多线程

多线程的创建

  • Tread类

  • Runnable接口

  • Callable接口

Tread类

(不建议使用,避免OOP单继承的局限性)

步骤:

  1. 自定义线程类继承Thread类

  2. 重新run()方法,编写线程执行体

  3. 创建线程对象Thread,调用start()方法启动线程

Runnable接口

步骤:

  1. 实现runnable接口

  2. 重新run()方法,编写线程执行体

  3. 创建实体对象和线程对象Thread

  4. 实现对象丢入Thread,调用start()方法启动线程

多线程中拿名字的代码:

Thread.currentThread().getName()

静态代理模式

  • 代理对象和真实对象都要实现同一接口

  • 代理对象要代理真实角色

Lamda表达式

作用:

  • 避免内部类定义过多

  • 代码看起来更简洁

  • 去掉没有意义的代码,只留下核心逻辑

函数式接口

一个接口只包含一个抽象方法,就是函数式接口

函数式接口 可以通过lambda表达式来创建借口对象

 

线程状态

  • 创建
  • 就绪
  • 阻塞
  • 运行
  • 死亡

线程停止

  • 不推荐使用stop()、destroy()等JDK废弃的方法

  • 推荐让线程自己停下来,使用一个标志进行终止变量,flag = false

线程休眠

  • 每个对象都有一把锁,sleep不会释放锁

  • sleep可以模拟网络延时(放大问题的发生性),倒计时等

  • sleep指定当前线程阻塞的毫秒数,到时间后线程进入就绪状态

  • sleep存在异常InteredException

线程礼让yield

  • 让进去的线程转为就绪状态,两个线程重新竞争

  • 礼让不一定成功

合并线程join

想象成VIP插队,待此线程执行完后再执行其他线程,其他线程阻塞

线程优先级

  • 本质是增大份额比例,以此来增高先执行的概率

  • main线程优先级最高

  • MAX_PRIORITY=10,最低为1,默认为5

  • 先设置优先级,再启动

守护(daemon)线程

  • 线程分为用户线程和守护线程,默认是用户线程

  • 用户线程执行完毕,程序就结束,不管守护线程是否结束

  • 守护线程例子:后台记录操作日志,监控内存,垃圾回收(gc)等

线程同步

形成条件:队列+锁

同步方法 synchronized

  • 一个对象一个锁

  • 当一个线程获得对象的锁时,独占资源,其他线程必须等待

  • 安全,但会降低效率

  • 锁方法本身

同步块:Obj同步监视器

  • 任何对象都能锁

死锁

两个或多个线程都在等待对方释放资源,都停止执行

lock锁

显式加锁和解锁:

ticket.lock();

ticket.unlock();

如果同步代码有异常需要将unlock()写入finally语句块

posted @ 2023-06-16 08:44  Hmzzz2  阅读(5)  评论(0编辑  收藏  举报