Java 线程间通讯

源代码 2024-9-30 21:39:12 134 0 来自 中国
1. 线程之间怎样通讯


  • 共享内存(隐式通讯)
  • 消息通报(显式通讯 wait / notify synchronized)
1.2 壅闭


  • BLOCKED 和 WAITING 的线程都处于壅闭状态,不占用 CPU 时间片
  • BLOCKED 线程会在 Owner 线程开释锁时唤醒
  • WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入 EntryList 重新竞争
2. wait() / notify() / notifyAll()


  • 都是 Object 对象的方法,必须获得此对象的锁,才华调用这些方法
  • obj.wait()
  • obj.notify()  唤醒 obj 上恣意一个线程
  • obj.notifyAll() 唤醒 obj 上全部正在 WaitSet 等待的线程
2.1 wait()

public class Demo {    // 声明为 final, 体现引用不可变,若引用变了,synchronized 锁的就是不同对象    static final Object obj = new Object();    public static void main(String[] args) throws InterruptedException {        obj.wait();    }}运行会抛异常 Exception in thread "main" java.lang.IllegalMonitorStateException,因为此时并未获得锁
public class Demo {    static final Object obj = new Object();    public static void main(String[] args) throws InterruptedException {        synchronized (obj) {            obj.wait();        }    }}使用 synchronized 先获得锁,成为该锁的 owner, 然后再调用 wait()
2.2 wait(long n)

有时限的等待,到 n 毫秒后竣事等待,或被 notify()
    public final void wait() throws InterruptedException {        wait(0);    }    public final native void wait(long timeout) throws InterruptedException;    public final void wait(long timeout, int nanos) throws InterruptedException {}示例
static final Object obj = new Object();public static void main(String[] args) {    new Thread(() -> {        synchronized (obj) {            log.debug("start...");            try {                obj.wait(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            log.debug("do something...");        }    }).start();}2.3 notify() / notifyAll()

@Slf4jpublic class Demo {    static final Object obj = new Object();    public static void main(String[] args) throws InterruptedException {        new Thread(() -> {            synchronized (obj) {                log.debug("run...");                try {                    obj.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }                log.debug("do something...");            }        }).start();        new Thread(() -> {            synchronized (obj) {                log.debug("run...");                try {                    obj.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }                log.debug("do something...");            }        }).start();        TimeUnit.SECONDS.sleep(1);        synchronized (obj) {            // obj.notify();            obj.notifyAll();        }    }}3. wait() vs sleep()


  • wait(), notify() 和 notifyAll() 被界说在 Object 类,而 sleep() 界说在 Thread 类
  • wait() 要在同步代码块内使用(要先获取对象锁,和 synchronized 一起用),而 sleep() 不必要
  • wait() 在等待的时候会开释对象锁,而 sleep() 在就寝的同时,不会开释对象锁
public class Thread implements Runnable {    public static native void sleep(long millis) throws InterruptedException;}public class Object {    public final native void wait(long timeout) throws InterruptedException;}3.1 验证 sleep() 不开释锁

@Slf4jpublic class Demo {    static final Object obj = new Object();    public static void main(String[] args) throws InterruptedException {        new Thread(() -> {            synchronized (obj) {                log.debug("start...");                try {                    TimeUnit.SECONDS.sleep(3);                } catch (InterruptedException e) {                    e.printStackTrace();                }                log.debug("do something...");            }        }).start();        TimeUnit.SECONDS.sleep(1);        // main 线程想获取锁,并实行逻辑        synchronized (obj) {            log.debug("run...");        }    }}实行效果
22:16:16.687 [Thread-0] DEBUG com.example.concrete.Demo - start...22:16:19.691 [Thread-0] DEBUG com.example.concrete.Demo - do something...22:16:19.691 [main] DEBUG com.example.concrete.Demo - run...
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 16:24, Processed in 0.144888 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表