我是靠谱客的博主 细心人生,最近开发中收集的这篇文章主要介绍java sleep方法_Java高并发2线程wait、sleep、yield、notify、join方法总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、复习上次连载

  • 两个基本单位
  • 线程进程的组成
  • 程序计数器定义以及执行native方法时是什么
  • 三种创建方式:extends Thread    重写run    new 实例().start(); implements Runnable  重写run   new Thread(new 实例()).start(); implements Callable 重写call(),有返回值    new FutureTask(new 实例())    new Thread(new FutureTask()).start()    FutureTask实例.get()
  • 关键字native,生成图
  • synchronized(对象){}      synchronized void method(变量){}
  • synchronized(obj){while(条件不满足){obj.wait()}}  防虚假唤醒

二、wait()方法

1.使用注意点

  • 使用wait()方法用于阻塞该线程,该线程获取了对象锁之后,然后调用该对象的wait()方法,就是释放该对象,其他线程可以紧接着调用。
  • 一个线程中如果多层获取了对象锁,那么如果释放其中一个或者多个,对其他未释放的对象锁是不会产生影响的。
  • 当一个线程调用共享对象的wait()方法被阻塞挂起后,如果其他线程中断了该线程,则该线程会抛出一个InterruptedException异常并返回。

2.带参数的wait()方法

  • wait(long timeout),参数单位为ms,该方法代表线程挂起多少秒后超时返回,除非在此期间会使用notify()或者notifyAll()方法来唤醒线程。wait(0)与wait()方法一致,wait()方法内部实现机制就是wait(0);如果参数是一个负数,那么就会返回一个IllegalArgumentException
  • 实现wait(long timeout,int nanos)函数
public final void wait(long timeout,int nanos) throws InterruptedException{
 if(timeout<0){
  throw new IllegalException("timeout value is negative");
 }
 if(nanos<0 || nanos > 999999){
  throw new IllegalException("nanosecond timeout value out of range");
 }
 if(nanos>0){
  timeout++;
 }
 wait(timeout);
}

三、notify()和notifyAll()函数

  • 一个线程调用共享对象的notify()方法之后,会唤醒一个在该共享变量上调用的wait系列方法后被挂起的线程,一个共享变量上可能有多个线程在等待,具体唤醒哪一个等待的线程是随机的。被唤醒的线程不能马上从wait方法返回并继续执行,需要先获得锁,也就是说,被wait()方法挂起的线程必须竞争该锁,获得后才能继续执行。notify()函数就是唤醒所有被挂起的线程

四、join方法

  • 该方法用于线程等待,也就说必须这条线程结束之后才能继续下面的语句

五、sleep方法

  • 该方法是一个静态方法,使用方法Thread.sleep(秒数),在睡眠期间其他线程调用了interrupt方法的话,该线程会抛出InterruptedException异常。

六、yield方法

package com.ruigege.threadFoundation1;

public class UserYieldMethod implements Runnable{
 
 public UserYieldMethod() {
  Thread thread = new Thread(this);
  thread.start();
 }
  
 @Override
 public void run() {
  System.out.println("开始一个线程"+Thread.currentThread());
  Thread.yield();
  System.out.println("结束一个线程"+Thread.currentThread());
  
 }
 
 public static void main(String[] args) {
  new UserYieldMethod();
  new UserYieldMethod();
  new UserYieldMethod();
 }
}
e2b2f4973c11ab46a296976951b2b734.png
2.1
  • 注释掉Thread.yield()ea600919e722c9612c52742a933c8ca8.png
  • 这个方法的目的就是让CPU让出自己还没有用完的时间片,让自己的线程处于就绪状态,多用于测试等

1.yield与sleep方法的区别

  • sleep调用线程处于阻塞,挂起状态,等待一定时间后再次恢复
  • yield是让出未用完的时间片,该线程处于就绪状态

七、源码:

  • https://github.com/ruigege66/ConcurrentJava
  • CSDN:https://blog.csdn.net/weixin_44630050
  • 博客园:https://www.cnblogs.com/ruigege0000/
  • 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流2a0692eb1940bc82f10aeb1223efd231.png

最后

以上就是细心人生为你收集整理的java sleep方法_Java高并发2线程wait、sleep、yield、notify、join方法总结的全部内容,希望文章能够帮你解决java sleep方法_Java高并发2线程wait、sleep、yield、notify、join方法总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部