Java多线程 chapter 3 线程间通信

chapter 3 线程间通信

3.1 等待/通信机制

3.1.1实现

wait()是object类方法,只能在同步方法或者同步块中调用wait()方法。 执行wait()方法后,当前线程释放锁,在从wait返回前,线程与其他线程竞争重新获得锁。 如果调用wait,没有持有锁,会抛出IllegalMonitorStateException 属于 RuntimeException。不需要try——catch。

notify()方法执行后,并不立即释放锁。 如果发出notify操作没有处于阻塞状态中的线程,那么该命令会被忽略。notifyAll 可以使正在等待队列中等待同一共享资源的”全部“线程从等待状态退出,进入可运行状态。优先级最高或者随机执行。

3.1.2线程的生命周期

新建一个线程对象后,再调用它的start方法,系统会为线程分配CPU资源,使其处于Runnable(可运行)状态。如果线程抢占到CPU资源,就处于Running状态。Running和Runnable可以相互切换。 Blocked是阻塞状态。 Run()方法结束后,进入销毁阶段。

每个锁对象有两个队列,一个是就绪队列,一个是阻塞队列。就绪队列获得了将要获得锁的线程,阻塞队列存储的被阻塞队列。一个线程被唤醒,会进入就绪队列,等待CPU调度。反之一个线程wait后,会进入阻塞队列,等待被唤醒。

3.1.3 当interrupt方法遇到wait方法。

当线程呈wait状态时。调用线程对象interrupt方法会出现InterruptedExce异常。

3.1.4wait(long) 的方法

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

3.1.5 生产者/消费者模式。

1.一生产与一消费:操作值。 2.多生产与多消费:操作值–假死。notify不能保证唤醒的是异类。可能唤醒同类。改为notifyAll。 3.一生产与一消费:操作栈。生产者向堆栈list放入对象。消费者从堆栈中取出数据。 4.一生产与多消费:操作栈–解决wait条件改变与假死。 5.多生产与一消费:操作栈。 6.多生产与多消费:操作栈。

3.1.6通过管道进行线程间通信:字节流。

3.1.7通过管道进行线程通信:字符流。

3.2方法join的使用

3.2.1join()

方法join的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程无限期阻塞。等待线程x销毁后执行。 join内部使用wait方法进行等待。所以join遇到interrupt会出现异常,同wait遇到interrupt

3.2.2join(long)的使用

设置等待时间,时间到,再争夺对象锁,
join 会释放对象锁,而sleep不会释放对象锁。

3.3 类ThreadLocal的使用

将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以储存每个线程的私有数据。
方法get与初始值null
类ThreadL解决的是变量在不同线程间的隔离性,也就是不同线程拥有不同值,放入ThreadLocal类中进行保存。

3.1.2

覆盖initialValue() 方法具有初始值。

3.4InheritableThreadLocal

可以在子线程中取得父线程中继承下来的值。
覆盖 childValue方法可以改变继承值。
如果子线程在取值时,父线程将InheritableThreadLocal中的值进行修改,那么线程中取得的值还是旧值。

你可能感兴趣的:(学习笔记)