• 技术文章 >Java >java教程

    Java中线程等待与通知的实现方法

    黄舟黄舟2017-09-26 10:06:53原创925
    这篇文章主要介绍了java 中线程等待与通知的实现的相关资料,希望通过本文能帮助到大家,让大家掌握这样的功能,需要的朋友可以参考下

    java 中线程等待与通知的实现

    前言:

    关于等待/通知,要记住的关键点是:

    必须从同步环境内调用wait()、notify()、notifyAll()方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。

    wait()、notify()、notifyAll()都是Object的实例方法。与每个对象具有锁一样,每个对象可以有一个线程列表,他们等待来自该信号(通知)。线程通过执行对象上的wait()方法获得这个等待列表。从那时候起,它不再执行任何其他指令,直到调用对象的notify()方法为止。如果多个线程在同一个对象上等待,则将只选择一个线程(不保证以何种顺序)继续执行。如果没有线程等待,则不采取任何特殊操作。

    示例代码:


    package threadwait;
    
    public class ThreadA extends Thread{
    
      public int num = 0;
    
      public void run(){
    
        synchronized (this){//在此类对象上实现同步,this指代当前对象
    
          for(int i = 0 ; i < 3 ; ++i)
    
           this.num+=i;
    
          notifyAll();//通知所有在这个对象上等待的线程开始执行,在这里就是通知TestNotify主线程开始执行
    
        }
    
      }
    
      public int getNum(){
    
        return this.num;
    
      }
    
    }


    package threadwait;
    
     
    
    public class TestNotify{
    
      public static void main(String args[]){
    
        ThreadA threada = new ThreadA();
    
        threada.start();//threada线程有执行的资格,但是还没有开始执行
    
        synchronized(threada){
    
          try{
    
           threada.wait();//主线程等待threada线程执行结束才开始执行
    
           //而且只有获得了当前threada对象的锁之后才能执行wait,就是说在同步域内才可以执行wait,执行wait后放弃对象锁
    
          }catch(InterruptedException e){
    
           e.printStackTrace();
    
          }
    
        }
    
        System.out.println(threada.getNum());
    
      }
    
    }

    同步可以是在class级别上的,synchronized(A.class),也可以是在对象级别上的synchronized(this),可以是静态同步方法,static synchronized ,静态同步方法是在class级别上的,非静态同步方法是在类对象级别上的,一个类对象只有一个锁,只有获得了该锁才可以对他执行wait操作,后释放掉该锁。

    更进一步的实例代码如下:


    package threadwait;
    
     
    
    public class ThreadA extends Thread{
    
      public int num = 0;
    
      public void run(){
    
        synchronized (this){//在此类对象上实现同步,this指代当前对象
    
          for(int i = 0 ; i < 3 ; ++i)
    
           this.num+=i;
    
          try{
    
           Thread.sleep(500);//如果ThreadB的三个示例线程在还没有进入等待状态之前就受到了notifyall的信号
    
           //那将会发生严重后果,因为调用notifyall的线程只可以调用一次notifyall,那造成等待的线程将永远等待下去
    
           //所以在此处让它睡一小会,让其他线程有时间进入等待状态。
    
           //不然会收到
    
          }catch(InterruptedException e){
    
           e.printStackTrace();
    
          }
    
          notifyAll();//通知所有在这个对象上等待的线程开始执行,在这里就是通知TestNotify主线程开始执行
    
        }
    
    //   notifyAll();
    
      }
    
      public int getNum(){
    
        return this.num;
    
      }
    
    }


    package threadwait;
    
     
    
    public class ThreadB extends Thread{
    
      private ThreadA threada;
    
      public ThreadB(ThreadA ta){
    
        this.threada = ta;
    
      }
    
      public void run(){
    
        System.out.println(Thread.currentThread().getName()+" is waitting.");
    
        synchronized(threada){
    
          try{
    
           threada.wait();
    
          }catch(InterruptedException e){
    
           e.printStackTrace();
    
          }
    
          System.out.println(Thread.currentThread().getName()+" "+this.threada.getNum());
    
        }
    
       
    
      }
    
    }


    package threadwait;
    
     
    
    public class TestNotify{
    
      public static void main(String args[]){
    
        ThreadA threada = new ThreadA();
    
        new ThreadB(threada).start();
    
        new ThreadB(threada).start();
    
        new ThreadB(threada).start();
    
        threada.start();
    
      }
    
    }

    以上就是Java中线程等待与通知的实现方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java 实现 通知
    上一篇:Java中程序运行机制以及错误的分析 下一篇:Java中关于IO使用入门的简单介绍(图)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 实例介绍基于Java实现一个复杂关系表达式过滤器• Java之对象销毁和finalize方法的使用• 详细解析java词法分析器DDL递归应用• java实例解析之1M图片压缩优化到100kb• 简单归纳java线程池的四种创建方式
    1/1

    PHP中文网