多线程的sleep、yield、join用法及sleep与wait的区别

Thread类的方法列表:sleep、yield、join用于线程的协作,围绕线程的调度

注意: 只有sleep方法不释放锁,其他都释放锁

1、join()等待线程结束:调用join方法的线程,执行结束后才会释放锁主线程main中调用启动线程(调用start),然后调用该线程的join方法,可以达到主线程等待工作线程运行结束后才执行的效果,并且join要在start之后调用。

2、sleep()暂停执行当前线程,让线程睡眠一段时间:挂起线程一段时间,让出CpU,不释放锁,(注意不要在同步代码块里面长时间sleep,会造成线程阻塞)

  sleep()方法实际使用场景举例

  (1)系统调用第三方接口失败后的重试:在调用失败后,调用sleep()方法休眠1秒后,重试,注意要设置重试的次数;

  (2)简单的接口限流:防止恶意刷新接口;

  (3)测试环节中,模拟耗时业务:例如订单支付业务中,模拟订单支付耗时,测试前端loading、超时的逻辑;

  (4)轮询等待

3、interrupt()中断线程:中断当前线程,抛出异常,释放锁

4、yield()暂停线程:使正在执行的线程临时暂停,允许其他线程执行,让出CpU,不释放锁,当前线程从运行态变为就绪runnable状态(可能别人抢到CpU也可能是它自己抢到):

  1. 无限循环不占满 CPU(后台监控、心跳线程必备)
  2. 让重要业务线程优先执行(主线业务 > 后台监控)
  3. 多线程公平调度,避免某线程霸占 CPU
  4. 轻量级调度,比 sleep 更灵活(不休眠)
  5. 注意点:
  1. yield () 不保证一定生效(操作系统最终决定)
  2. 不释放锁,同步代码块里不要乱用
  3. 不能替代 wait/sleep,它只是 “谦让” 不是 “等待”

  yield()方法实际使用场景举例

  (1)高优先级任务执行完,主动让出 CPU 给其他任务

  (2)无限循环中降低 CPU 占用,避免空转占满 CPU:  

           例如系统有一个后台监控线程(比如监控订单状态、监控队列、监控硬件状态),它是无限循环,如果不做处理,会占满 100% CPU,不能用 sleep(因为需要实时响应),解决方案:每次循环后 yield(),主动让出 CPU

image

image

  (3)多线程任务公平调度,防止某一个线程霸占 CPU:

   例如系统有两个相同优先级的工作线程:线程 A:处理日志,线程 B:处理消息推送,防止其中一个线程一直霸占 CPU,每次处理完一个小任务,就 yield() 让对方执行

image

  (4)实时性要求高的系统,做轻微调度优化

5、Thread.currentThread().getName()   :获取当前线程名字

 

以下两个方法是Object类定义的方法,java线程间通过他们实现通信

7、wait()使线程等待:挂起当前线程,直到interrupt()方法中断它或者另一个线程调用notify()或notifyAll()方法通知它。(wait方法调用时会释放锁,让出CpU

  wait方法只能在synchronized块或者synchronized方法中使用(因为要先获取锁,wait才能释放锁)

8、notify()或notifyAll():唤醒调用了wait()方法的线程,只能用在同步方法或同步块内部。

  notify与notifyAll区别:notifyAll会让所有处于等待池中的线程全部进入锁池去争夺锁,而notify只会随机让其中一个线程去争夺锁。

posted on 2018-03-27 15:59  黑子菜园  阅读(228)  评论(0)    收藏  举报

导航