zoukankan      html  css  js  c++  java
  • 深入理解多线程三

    涉及到:
    1.使用wait/notify实现线程间的通信
    2.生产者/消费者模式的实现
    3.方法join的使用
    4.ThreadLocal类的使用
     
    一.等待/通知机制
        线程与线程之间不是独立的个体,他们彼此之间可以相互通信和协作.
        wait()方法是Object类的方法,它的作用是使当前执行代码的线程进行等待,并释放对象锁,只能在同步方法或同步块中调用wait方法.
        notify()在要在同步方法或同步块中调用,作用是可以随机唤醒等待队列中等待同一共享资源的"一个"线程,并使该线程退出等待队列,进入可运行状态,注意的是执行notify()之后,当前线程不会马上释放该对象锁,呈wait()状态的线程也不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,,也就是退出synchronized代码块后,当前线程才释放锁,呈wait()状态所在的线程才可以获取该对象锁.
        notifyAll()方法可以使所有正在等待队列中等待同一共享资源的"全部"线程从等待状态退出,进入可运行状态.
        wait使线程停止运行,notify方法使停止的线程继续运行.
        每个锁对象都有两个对列,一个是就绪对列,一个是阻塞队列.就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,一个线程被唤醒之后,才会进入就绪队列,等待CPU的调度;反之,一个线程被wait之后,就会进入阻塞队列,等待下一次被唤醒.
    二.实例说明,请看下一篇.
    三.join的使用:
        方法join的作用是等待线程对象销毁,所用是使所属的线程对象x正常执行run()方法中的任务,从而使当前线程无期限的阻塞,等待线程x销毁后再继续执行当前线程后面的代码.
        join与synchronized的区别是:join在内部使用wait()方法进行等待,二synchronized关键字使用的是"对象监视器"原理作为同步.
        join与interrupt()方法彼此遇到,会报错.
        join(long)与sleep(long):join(long)方法具有释放锁的特点,而Thread.sleep(long)方法具有不释放锁的特点.
    四:类ThreadLocal的使用:
        类ThreadLocal主要解决的是每个线程绑定自己的值,实例说明.
  • 相关阅读:
    后缀零
    vs2019 MFC的安装 解决 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。
    矩形切割
    fsync: failed to connect to feed.openvas.org (89.146.224.58)
    How to Install GVM Trial With VMware Workstation Player/Pro
    GVM 21.04 (stable, initial release 20210416)
    gitlab 升级相关
    Adobe Reader XI 11.0.23 简体中文版
    gofileserver GO HTTP 文件下载服务器
    KVM 中安装 Windows 10 虚拟机、CentOS 8 虚拟机及快照操作
  • 原文地址:https://www.cnblogs.com/wadmwz/p/7804051.html
Copyright © 2011-2022 走看看