专业

深圳网站优化客服热线:SEO

揭秘百度SEO快排7天上首页秘籍详情

深圳网站优化

当前位置:首页 > 技术教程

Java并发编程四 线程 wait与notify &&join,sleep,wait三者区别 - hong查理的个人空间 - OSCHINA

来源: 作者: 访问次数:131

Java并发编程四 线程 wait与notify &&join,sleep,wait三者区别

h
 hong查理 发布于 9分钟前
字数 766
阅读 7
收藏 0
点赞 0
评论 0

【推荐阅读】微服务还能火多久?>>>

1.线程的wait,notify 做了什么

    当2条线程在争夺一个锁时,其中一条线程获得这把锁且执行了wait(),则这个线程放弃这把锁的权力,让另外一条线程执行。当另外一条线程执行了notify的时候则通知其他wait的线程可以来竞争这把锁了。

2.调用wait(4000)

public class Test {

    public   static  boolean isWait=false;
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("李雷");
        ThreadJoinTest t2 = new ThreadJoinTest("韩梅梅");
        t1.start();
        ThreadUtil.sleep(500);
        t2.start();
        System.out.println("Main thread is finished");
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void  run(){
        String obj  = "".intern();
      synchronized (obj){
          for(int i=0;i<3;i++){
              try {
                  if (!Test.isWait&&this.getName().equals("李雷")){
                      System.out.println(this.getName() + "wait:" + DateUtil.formatTime(new Date()));
                      Test.isWait=true;
                      obj.wait(4000);
                  }

              }catch (Exception e){
                  e.printStackTrace();
              }
              System.out.println(this.getName() + ":" + DateUtil.formatTime(new Date()));
              if (this.getName().equals("韩梅梅")){
//                  obj.notify();
              }
            ThreadUtil.sleep(1000);
          }
      }

    }
}

执行结果 可以看到,韩梅梅没有notify的情况些,李雷等待了4秒后继续获取锁执行。

李雷wait:14:32:56
Main thread is finished
韩梅梅:14:32:56
韩梅梅:14:32:57
韩梅梅:14:32:58
李雷:14:33:00
李雷:14:33:01
李雷:14:33:02

3.调用wait()

public class Test {

    public   static  boolean isWait=false;
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("李雷");
        ThreadJoinTest t2 = new ThreadJoinTest("韩梅梅");
        t1.start();
        ThreadUtil.sleep(500);
        t2.start();
        System.out.println("Main thread is finished");
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void  run(){
        String obj  = "".intern();
      synchronized (obj){
          for(int i=0;i<3;i++){
              try {
                  if (!Test.isWait&&this.getName().equals("李雷")){
                      System.out.println(this.getName() + "wait:" + DateUtil.formatTime(new Date()));
                      Test.isWait=true;
                      obj.wait();
                  }

              }catch (Exception e){
                  e.printStackTrace();
              }
              System.out.println(this.getName() + ":" + DateUtil.formatTime(new Date()));
              if (this.getName().equals("韩梅梅")){
//                  obj.notify();
              }
            ThreadUtil.sleep(1000);
          }
      }

    }
}

执行结果 可以看到,韩梅梅没有notify的情况下,李雷一直在等待,且程序无法正常退出。

4.调用wait()和notify()

public class Test {

    public   static  boolean isWait=false;
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("李雷");
        ThreadJoinTest t2 = new ThreadJoinTest("韩梅梅");
        t1.start();
        ThreadUtil.sleep(500);
        t2.start();
        System.out.println("Main thread is finished");
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void  run(){
        String obj  = "".intern();
      synchronized (obj){
          for(int i=0;i<3;i++){
              try {
                  if (!Test.isWait&&this.getName().equals("李雷")){
                      System.out.println(this.getName() + "wait:" + DateUtil.formatTime(new Date()));
                      Test.isWait=true;
                      obj.wait();
                  }

              }catch (Exception e){
                  e.printStackTrace();
              }
              System.out.println(this.getName() + ":" + DateUtil.formatTime(new Date()));
              if (this.getName().equals("韩梅梅")){
                  obj.notify();
              }
            ThreadUtil.sleep(1000);
          }
      }

    }
}

执行结果 可以看到,韩梅梅notify后,李雷立即获取锁执行代码。

李雷wait:14:36:52
Main thread is finished
韩梅梅:14:36:53
韩梅梅:14:36:54
韩梅梅:14:36:55
李雷:14:36:56
李雷:14:36:57
李雷:14:36:58

5.join,sleep,wait的区别

3个方法都会使线程进入等待状态

join 和 sleep 是线程方法,join 会让主线程停止执行,而sleep只会让当前线程停止执行

wait是Object方法,wait会释放锁把资源给其他线程,其他2个不会。

© 著作权归作者所有

  • 浅析网站建设时如何降低网站跳出率
  • 网站建设规划应考虑哪些因素
  • 农业网站建设维护保养内容指哪些方面?
  • 网站建设后网站运营实战技巧二-如何打造高质量外链
  • 网站建设三部曲:域名程序+主机
  • 网站推广价格及渠道分析
  • seo网站推广,seo网络推广,seo推广优化
  • 解锁SEO实战密码60天网站流量提高20倍-效果监测
  • 您应该内部进行SEO优化还是将SEO外包?
  • SEO网站排名,大量页面不收录,实际案例分享与解决方案!
  • 我们在撰写SEO原创文章时容易犯哪些错误
  • SEO优化中的「坑」-“死链”
  • 每周分享(蜘蛛)在SEO中扮演的角色
  • 您访问的网站存在风险!
  • 如何向老板传达SEO优化的重要性?
  • SEO推广霸屏效果,站内优化功不可没
  • 网络推广和网络营销有什么区别-西安新新人类网络
  • 网络推广效果不好我们怎么来找原因
  • 郑州网络推广公司哪家强?
  • 每天一个网络推广秘籍,新浪微博加速提升企业广告效果
  • SEO 网站优化的步骤和技巧有哪些?(上)
  • 不懂SEO技术,该如何进行互联网营销?
  • Google 广告投放看不到成效?快来检查独立站 SEO 设置!
  • SEO排名优化萎靡不振?是和缘故?
  • SEO优化listing总优化不好?那是因为你不懂这件事!
  • 浅谈网站建设时重点是什么
  • 小溪畅流浅谈网站建设对公司发展起到了什么样的作用?
  • 河南平头哥霸屏网络推广:网站优化就是不断更新网站吗?
  • 新手在公司上班应该怎么去做好网络推广工作
  • 成都网络推广排名呼之欲出?站内优化是核心
  • 2020家居企业如何低成本通过“网络推广”新增客户实例问答
  • 企业网站优化,为什么SEO人员配置与培训很重要?
  • 选择SEO,还是付费推广?
  • SEO关键词排名该掌握的核心优化技巧
  • 为啥爆单总与你无缘?学会亚马逊SEO技巧,你早就成大卖了
  • 积累有价值的seo资源提高网站优化效果
  • SEO网站优化,新手SEO常犯的五个错误!
  • 渠成填补SEO空白 助行业生生不息
  • 为什么Google SEO见效慢
  • 一组图告诉你什么叫史上最全的SEO优化步骤