V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jiangwenjie
V2EX  ›  Java

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

  •  
  •   jiangwenjie · 2020-04-27 14:33:01 +08:00 · 3313 次点击
    这是一个创建于 1656 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2020-04-28 09:06:27 +08:00
    由于看到评论区很多人猜测我想干什么?故附加一下问题的由来,在读《操作系统精髓与设计原理》的管程时读到了以下内容,管程有两种定义:
    1.Hoare 关于管程的定义[HOAR74]要求在条件队列中至少有一个进程,当另一个进程为该条件产生 csignal 时,立即运行队列中的一个进程,因此,产生 csignal 的进程必须立即退出或阻塞在管程上,但这会带来额外两次的进程切换。
    2.Lampson 和 Redell 对管程的定义[LAMP80],csignal 被 cnotify 取代,产生 cnotify 的进程不会立刻退出,但会向条件队列发送通知,由处理器决定何时启动条件队列中的线程。
    因此产生了对 Java 中 notify()的疑问,因为 wait(),notify()几乎是所有并发的基础,当然大家也可以扩散讨论到 join()等实现上。
    9 条回复    2020-04-27 18:35:03 +08:00
    pursuer
        1
    pursuer  
       2020-04-27 14:47:26 +08:00
    我印象中 notify 好像是唤醒等待线程用的,好像和放弃执行没有关系,而且时间片级别的操作大多依赖操作系统对线程调度的实现,不过如果线程进入等待的话理应可以立即放弃时间片的
    yjxjn
        2
    yjxjn  
       2020-04-27 14:58:45 +08:00
    @pursuer 你们工作中用多线程的地方多吗?
    guyeu
        3
    guyeu  
       2020-04-27 15:01:47 +08:00
    notify 是唤醒一个正在等待的线程。。当前线程为什么要放弃执行。。。我猜你想要 join ?
    sudden
        4
    sudden  
       2020-04-27 17:09:00 +08:00
    是在离开同步代码块之后,才会放弃执行。也就是 synchronized 结束或者 unlock() 之后。
    lanterboy
        5
    lanterboy  
       2020-04-27 17:27:42 +08:00
    楼主是想说 yield() 吧
    776491381
        6
    776491381  
       2020-04-27 17:32:36 +08:00
    notify 和楼主说的好像关系不大,notify 会从等待队列中随机选取一个放入到同步队列中,notify 的时候不会放锁的,会继续执行,执行到 cpu 时间片用完被调度,直到退出同步
    daozhihun
        7
    daozhihun  
       2020-04-27 17:41:35 +08:00
    你不会把 java 当成 node js 那样单线程执行的吧?
    pursuer
        8
    pursuer  
       2020-04-27 18:08:16 +08:00
    @yjxjn #2 我工作不是用 Java 的,只是自己做的一些工具是用 Java,因为不能堵塞 UI 线程,涉及网络,文件等耗时操作都会用到多线程
    useben
        9
    useben  
       2020-04-27 18:35:03 +08:00
    notify 用于唤醒睡眠等待状态的线程, 而且并不是马上执行的, 而是转换为可被调度状态, 等待 cpu 的调度. 调用 notify 的本线程该吃吃该喝喝
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:14 · PVG 05:14 · LAX 13:14 · JFK 16:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.