• 多线程的通信问题


    前提:

    1:当多个线程并发执行时, 在默认情况下CPU是随机切换线程的,每个线程执行的次序都是随机的。

    2:如果我们需要多个线程共同完成一个任务,并且希望他们有规律的执行(有可能是多线程间交替执行,有可能是当某个线程达到某个条件后才让其他线程执行),就需要线程之间协调通信。 

    3:我认为处理线程安全的同步锁机制,也算是线程间的通信。

    解决方案:等待唤醒机制

    1:一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。而且synchronized的锁对象和调用wait()、notify/notifyAll() 方法的对象必须是同一个对象。

    2:由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。

    3:wait()使当前线程阻塞,当线程执行wait()方法的时候,会释放当前的锁,然后让出CPU,进入等待状态。 

    4:只有当线程执行 notify/notifyAll() 方法的时候,才会唤醒一个或多个正处于等待状态的线程,然后当前线程继续往下执行,直到执行完synchronized 代码块的代码或是中途遇到wait() ,才会再次释放锁。

    5:notify/notifyAll() 的执行只是唤醒沉睡的线程,而不会立即释放锁,锁的释放要看代码块的具体执行情况。所以在编程中,尽量在使用了notify/notifyAll() 后立即退出同步代码块或者调用wait(),以唤醒其他线程让其获得锁

    例子:

  • 相关阅读:
    工厂方法模式
    策略模式
    MySQL
    装饰模式
    里式代换原则
    依赖倒转原则
    Java 7 for Absolute Beginners/Java 7基础教程--读后感
    Java 7 for Absolute Beginners/Java 7基础教程--代码纠错
    Eclipse JVM terminated.exit code=13
    Java程序设计教程(第2版)阅读总结
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302453.html
Copyright © 2020-2023  润新知