等待唤醒机制

线程状态

  1. 新建状态 new 刚创建的时候
  2. 运行状态 runnable 正在运行
  3. 阻塞状态 blocked 没有cpu执行时间(没抢过别人)
  4. 死亡状态 terminated run()结束 或者stop()过时
  5. 休眠状态 timed_waiting sleep 或者wait
  6. 无限等待状态 waiting 一直处于waitng等待唤醒机制_第1张图片
    等待唤醒案例

等待唤醒机制_第2张图片
代码实现:需要同步代码块 同时锁对象要相同 这样等待唤醒是一个锁
分析:

  1. 创建一个顾客线程
  2. 创建一个老板线程
  3. 老板和顾客线程必须使用同步代码块包裹起来 保证等待唤醒只有一个在执行
  4. 同步使用的锁对象必须保证唯一
  5. 只有锁对象能调用wait和notify方法
package Demo58;

public class Demo581WaitingNotify {
    public static void main(String[] args) {
        Object object=new Object();//创建锁对象保证唯一
        new Thread(){//顾客线程
          @Override
            public void  run(){
              synchronized (object){
                  System.out.println("我要两个肉包子");
                  try {
                      object.wait();
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  //唤醒之后会执行的代码
                  System.out.println("包子拿到了真好吃");
              }

          }
        }.start();
        new  Thread(){//老板线程
            @Override
            public  void  run(){
                try {
                    Thread.sleep(5000);//做了五秒的包子
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (object){
                    System.out.println("老板做了五秒包子给了顾客");
                    object.notify();//唤醒
                }
            }
        }.start();
    }
}

进入timewaiting(计时等待)两种方式

  1. 使用sleep(long m)方法在毫秒结束后线程睡醒进入Runnable或者Blocked状态
  2. 使用wait (long m) 方法 wait方法在好眠值结束之后还没有被notify唤醒就会自动醒来 进入Runnable状态
    唤醒方法
  3. notify() 唤醒此对象监视器上的等待的单个线程
  4. 唤醒此对象监视器等待的所有线程。所有线程还是进行cpu的抢夺

、、、、这是设置wait时间参数 、、、、

package Demo58;

public class Demo581WaitingNotify2 {
    public static void main(String[] args) {
        Object object=new Object();//创建锁对象保证唯一
        new Thread(){//顾客线程
          @Override
            public void  run(){
              while (true){
                  synchronized (object){
                      System.out.println("我要两个肉包子");
                      try {
                          object.wait(2000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      //唤醒之后会执行的代码
                      System.out.println("包子拿到了真好吃");
                  }

              }
              }
        }.start();

}
}

、、、、这是同时开启所有的等待线程、、、、

package Demo58;

public class Demo581WaitingNotify3 {
    public static void main(String[] args) {
        Object object=new Object();//创建锁对象保证唯一
        new Thread(){//顾客线程
          @Override
            public void  run(){
              while (true){
                  synchronized (object){
                      System.out.println("顾客二:我要两个肉包子");
                      try {
                          object.wait(2000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      //唤醒之后会执行的代码
                      System.out.println("包子拿到了真好吃");
                      System.out.println("///////");
                  }

              }
              }
        }.start();
        new Thread(){//顾客线程
            @Override
            public void  run(){
                while (true){
                    synchronized (object){
                        System.out.println("顾客一我要两个肉包子");
                        try {
                            object.wait(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //唤醒之后会执行的代码
                        System.out.println("包子拿到了真好吃");
                        System.out.println("////////////");
                    }

                }
            }
        }.start();
        new  Thread(){//老板线程
            @Override
            public  void  run(){
                try {
                    Thread.sleep(5000);//做了五秒的包子
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (object){
                    System.out.println("老板做了五秒包子给了顾客");
                    //object.notify();//唤醒
                object.notifyAll();
                }
            }
        }.start();
}
}

你可能感兴趣的:(java从0开始,建议新手观看)