您的位置:首页 > 编程语言 > Java开发

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

2017-01-23 13:43 387 查看
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类可以让子线程从父线程中取得值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 编程 技术