zoukankan      html  css  js  c++  java
  • 线程间的“通信”方法

    等待/通知机制

    不适用等待通知机制

    可以用while(true)死循环和sleep()实现
    缺点:while(true)的时间间隔过小会消耗资源,过大会抓不住通知的最佳时机,所以不适合线程通信

    wait()和notify()实现通信

    wait()可以使当前执行代码的线程进行等待。只能再同步代码中调用wait()方法。wait()方法会释放锁。
    notify()方法会随机唤醒一个在wait()状态的线程。只能再同步代码中调用notify()方法。notify()方法不会释放锁。notifyAll()会唤醒所有wait()状态的线程。
    两个方法都是Object的方法。wait()使线程停止运行,notify使停止的线程继续运行。

    wait(long)

    等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。

    管道流

    JDK提供了四个类使线程间可以通信

    • PipedInputStream 和 PipedOutputStream
    • PipedReader 和 PipedWriter

    join方法

    主线程想等待子线程方法结束后再执行,只需要在主线程中调用子线程的join()即可实现。join的作用是等待线程对象销毁。对象销毁之后继续执行后面的代码。

    join和synchronized的区别

    join内部使用wait方法进行等待,synchronized关键字使用“对象监视器”原理作为同步。

    join(long)和sleep(long)

    join(long)内部使用wait(long)来实现,会释放锁。
    sleep(long)是Thread的方法,不会释放锁。

    ThreadLocal

    ThreadLocal类使为了解决每一个线程拥有自己的共享变量问题。ThreadLocal的值只对当前线程可见,在线程之间具有隔离性,每个线程都拥有自己的值。

    set()和get()

    可以使用set()和get()方法进项赋值和取值,默认get到的值是null。可以继承ThreadLocal类重写initialValue()方法设置get的默认值。

    InheritableThreadLocal

    类InheritableThreadLocal可以在子线程中取得父线程继承下来的值。

    重写InheritableThreadLocal类的initialValue方法可以获取父线程的值。
    重写InheritableThreadLocal类的childValue方法可以修改继承到的值。

  • 相关阅读:
    Redis 在 分布式项目中 的小应用--分布式锁 模拟session 分布式自增id
    自动生成swagger 前后端分离 对接文档
    利用IDEA 把maven工程中spring-boot的某个模块打成jar包
    利用SQL语句,把本地Excel文件批量导入mysql数据库,做测试数据使用
    Java常用API-String类
    网络编程模型及TCP、UDP编程设计
    计算机网络模型构架分析
    多线程程序的设计详解
    多进程、进程间通讯设计
    Linux 文件编程、时间编程基本函数
  • 原文地址:https://www.cnblogs.com/farmersun/p/12659830.html
Copyright © 2011-2022 走看看