V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jiangwenjie
V2EX  ›  Java

Java 里调用 notify()后,当前线程会立刻放弃继续执行吗(哪怕分配给当前线程的时间片没用完)?

  •  
  •   jiangwenjie · Apr 27, 2020 · 4117 views
    This topic created in 2199 days ago, the information mentioned may be changed or developed.
    Supplement 1  ·  Apr 28, 2020
    由于看到评论区很多人猜测我想干什么?故附加一下问题的由来,在读《操作系统精髓与设计原理》的管程时读到了以下内容,管程有两种定义:
    1.Hoare 关于管程的定义[HOAR74]要求在条件队列中至少有一个进程,当另一个进程为该条件产生 csignal 时,立即运行队列中的一个进程,因此,产生 csignal 的进程必须立即退出或阻塞在管程上,但这会带来额外两次的进程切换。
    2.Lampson 和 Redell 对管程的定义[LAMP80],csignal 被 cnotify 取代,产生 cnotify 的进程不会立刻退出,但会向条件队列发送通知,由处理器决定何时启动条件队列中的线程。
    因此产生了对 Java 中 notify()的疑问,因为 wait(),notify()几乎是所有并发的基础,当然大家也可以扩散讨论到 join()等实现上。
    9 replies    2020-04-27 18:35:03 +08:00
    pursuer
        1
    pursuer  
       Apr 27, 2020
    我印象中 notify 好像是唤醒等待线程用的,好像和放弃执行没有关系,而且时间片级别的操作大多依赖操作系统对线程调度的实现,不过如果线程进入等待的话理应可以立即放弃时间片的
    yjxjn
        2
    yjxjn  
       Apr 27, 2020
    @pursuer 你们工作中用多线程的地方多吗?
    guyeu
        3
    guyeu  
       Apr 27, 2020
    notify 是唤醒一个正在等待的线程。。当前线程为什么要放弃执行。。。我猜你想要 join ?
    sudden
        4
    sudden  
       Apr 27, 2020
    是在离开同步代码块之后,才会放弃执行。也就是 synchronized 结束或者 unlock() 之后。
    lanterboy
        5
    lanterboy  
       Apr 27, 2020
    楼主是想说 yield() 吧
    776491381
        6
    776491381  
       Apr 27, 2020
    notify 和楼主说的好像关系不大,notify 会从等待队列中随机选取一个放入到同步队列中,notify 的时候不会放锁的,会继续执行,执行到 cpu 时间片用完被调度,直到退出同步
    daozhihun
        7
    daozhihun  
       Apr 27, 2020
    你不会把 java 当成 node js 那样单线程执行的吧?
    pursuer
        8
    pursuer  
       Apr 27, 2020
    @yjxjn #2 我工作不是用 Java 的,只是自己做的一些工具是用 Java,因为不能堵塞 UI 线程,涉及网络,文件等耗时操作都会用到多线程
    useben
        9
    useben  
       Apr 27, 2020
    notify 用于唤醒睡眠等待状态的线程, 而且并不是马上执行的, 而是转换为可被调度状态, 等待 cpu 的调度. 调用 notify 的本线程该吃吃该喝喝
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   926 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 18:25 · PVG 02:25 · LAX 11:25 · JFK 14:25
    ♥ Do have faith in what you're doing.