Java多线程编程核心技术第三章笔记

1.wait()方法:将当前正在执行的线程置入“预处理队列”中,并且在wait()代码处停止执行。需要

注意的是在调用wait()方法的时候必须获得该对象的对象级别锁,即wait()方法必须放在同步代码

块中。否则在运行的时候会抛出IllegalMonitorStateException,它是RuntimeException的一个子类,

所以无需try-catch进行捕捉异常。
2.notify()也需要在同步代码块中执行。该方法用来通知其他正在等待该对象的对象锁的其他线程,

在执行notify方法后,当前线程不会立即退出线程,而是当前线程里面的方法全部执行完之后才退出线

程。而正在wait的线程如果有多个,则由线程规划器随机挑选一个正在等待的线程进行等待。
3.创建一个新的线程后,调用start()方法,系统会为此线程分配CPU资源,使其处于Runnable(可运

行)状态,这是一个准备运行的阶段。如果线程抢到CPU资源,此线程就处于Running(运行)状态。
4.线程进入Runnable状态大体可分为以下五种情况:
(1)调用sleep方法之后等待时间超过了sleep规定的时间;
(2)线程调用的阻塞IO已经返回,阻塞方法执行完毕;
(3)线程成功地获得了试图同步的监视器;
(4)线程正在等待通知,而通知已发出;
(5)处于挂起的线程调用了resume方法。
5.出现阻塞的情况大体分为以下5中:
(1)线程调用sleep()方法,主动放弃占用的处理器资源;
(2)线程调用了阻塞式的IO方法,在该方法返回前,该线程被阻塞;
(3)线程企图获得一个对象监视器,但该对象监视器正在被其他线程调用;
(4)线程在等待某个通知;
(5)在使用了suspend方法将该线程挂起,此方法容易造成死锁,应避免。
6.当wait()方法遇到wait方法时,会出现InterruptedException异常。
7.wait(long):等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。
8.生产者/消费者模式实现的几种状况:
(1)一生产与一消费(操作值和操作栈);
(2)多生产与多消费:容易造成假死现象,在唤醒的时候用notifyAll进行唤醒。
(3)一生产与多消费——操作栈
(4)多生产与一消费:操作栈
9.线程间的通信使用了管道流(pipeStream),Java中的JDK提供了4个类来使线程间之间通信:
(1)PipedInputStream和PipedOutputStream
(2)PipedReader和PipedWriter
10.线程间通信使用outputStream.connect(inputStream)
11.join():方法join的作用是等待子线程执行完之后再执行主线程下面的。join与synchronize的区别是

:join在内部使用wait方法进行等待,而synchronize使用“对象监视器”原理进行同步。
12.方法join()与interrupt()方法彼此遇到,会抛出interruptedException异常。
13.join(long)等待的毫秒数,期间如果其他线程运行不完,则继续往下执行。它与sleep的区别是

sleep的时候不释放对象锁,而用join会释放对象锁。
14.ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放的盒子,

盒子中可以存放每个线程的私有数据。
使用方法:ThreadLocal<类型> threadLocal = new ThreadLocal<类型>
其中可以继承ThreadLocal类然后重写它的initialValue()方法set进去默认值。
可以使用set()赋值,get()取值。
15.使用类InheritableThreadLocal类可以让子线程从父线程中取得值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值