zoukankan      html  css  js  c++  java
  • 4.等待和通知

    等待和通知

    Object对象提供了wait( ) 方法和 notify ( ) 方法。

    wait( )方法需要配对着synchronized 关键字使用。

    当一个线程的资源调用 wait( )方法时,它会失去锁,然后进入等待序列。

    当其他线程调用notify方法时才会重新激活。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class NotifyAndWait{
    
        private static Object object = new Object();
    
    
        static class WaitThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("WaitThread Start!");
                try {
                    System.out.println("Object wait!!!");
                    synchronized (object) {
                        object.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("WaitThread Finish!");
            }
        }
    
        static class NotifyThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("NotifyThread Start!");
                System.out.println("Object notify");
                synchronized (object) {
                    object.notify();
                }
                System.out.println("NotifyThread Finish!");
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            new WaitThread().start();
    
            TimeUnit.SECONDS.sleep(5);
    
            new NotifyThread().start();
    
        }
    }
    
    
    
    

    运行结果:

    WaitThread Start!

    Object wait!!!

    NotifyThread Start!

    Object notify

    NotifyThread Finish!

    WaitThread Finish!

    notify( )方法只会随机激活等待序列中的一个线程,而notifyAll( )方法激活所有等待的线程。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class NotifyAndWait{
    
        private static Object object = new Object();
    
    
        static class WaitThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("WaitThread Start!");
                try {
                    System.out.println("Object wait!!!");
                    synchronized (object) {
                        object.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("WaitThread Finish!");
            }
        }
    
        static class NotifyThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("NotifyThread Start!");
                System.out.println("Object notify");
                synchronized (object) {
                    object.notify();
                }
                System.out.println("NotifyThread Finish!");
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            new WaitThread().start();
    
            new WaitThread().start();
    
            TimeUnit.SECONDS.sleep(5);
    
            new NotifyThread().start();
    
        }
    }
    
    
    
    

    运行结果:

    WaitThread Start!

    Object wait!!!

    WaitThread Start!

    Object wait!!!

    NotifyThread Start!

    Object notify

    NotifyThread Finish!

    WaitThread Finish!

    结果分析:

    两个WaitThread线程只被唤醒了一个。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class NotifyAndWait{
    
        private static Object object = new Object();
    
    
        static class WaitThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("WaitThread Start!");
                try {
                    System.out.println("Object wait!!!");
                    synchronized (object) {
                        object.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("WaitThread Finish!");
            }
        }
    
        static class NotifyThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("NotifyThread Start!");
                System.out.println("Object notify");
                synchronized (object) {
                    object.notifyAll();
                }
                System.out.println("NotifyThread Finish!");
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            new WaitThread().start();
    
            new WaitThread().start();
    
            TimeUnit.SECONDS.sleep(5);
    
            new NotifyThread().start();
    
        }
    }
    
    
    
    

    运行结果:

    WaitThread Start!

    Object wait!!!

    WaitThread Start!

    Object wait!!!

    NotifyThread Start!

    Object notify

    NotifyThread Finish!

    WaitThread Finish!

    WaitThread Finish!

    结果分析:

    notifyAll( )方法会唤醒处在等待序列中的所有线程。

  • 相关阅读:
    洛谷P1710 地铁涨价
    洛谷P1371 NOI元丹
    洛谷P2409 Y的积木
    洛谷P3392 涂国旗
    洛谷P3370 【模板】字符串哈希
    洛谷P3379 【模板】最近公共祖先(LCA)
    洛谷P3372 【模板】线段树 1
    洛谷P3373 【模板】线段树 2
    Android(java)学习笔记31:泛型高级之通配符
    Android(java)学习笔记30:泛型接口的概述和使用
  • 原文地址:https://www.cnblogs.com/TimerHotel/p/thread04.html
Copyright © 2011-2022 走看看