1. 理解多线程
1.1. 线程和进程
电脑上的每一个应用程序都是一个进程,一个进程可以包含一个或多个线程。线程是可以并发执行的。main()函数是一个主线程。
Publicvoid main(String[] args){
线程1;
线程2;
。。。。。。。//以下是main函数中的代码
线程3;
……………//以下是main函数中的代码
}
进入Main函数后,同时有3个线程在执行,分别是main线程,线程1,线程2;待。。。。。执行完后,线程3和………….同步运行。
1.2. Cpu如何控制线程
Cpu是可以执行多进程和多线程的,但是在同一时刻它只能执行一个线程,因为执行速度很对,所以让人觉得执行多线程多进程。Cpu调用线程在排除优先级的情况下(优先级由当前线程的setPriority()方法设定。Thread.currentThread.setPriority()),是随机的。
2. 多线程的生命周期
2.1. 多线程的5个生命阶段,各个阶段的意义
2.2. 对线程生命周期产生影响的方法
2.2.1. sleep()
是当前线程从运行状态转入阻塞状态,该方法有个参数表示阻塞时间,超过该时间后从阻塞转入就绪状态,等待线程调度器再次调度。阻塞期间,cpu将调度其它线程。
2.2.2. yield()
直接将线程转入就绪状态,等待cpu调度。所以,调用该方法后还可能,该线程还可能被cup调度,这和线程的优先级有关。
3. 多线程的创建和启动
3.1. 多线程创建的两种方法
3.1.1. 继承Thread子类
详见16.2中的FirstThread.java
3.1.2. 实现Runnable接口
详见16.3中的SecondThread.java
3.2. 两种方法的区别
继承只要初始化之后调用start()方法即可使线程处于就绪状态;实现接口的类初始化后只能作为一个target,还得调用new Thread(target).start(),才能使当前线程处于初始化状态。
继承使得实例属性不能够被共享,接口可以。
4. 线程同步
4.1. 什么是线程同步与线程安全
4.1.1. 线程安全
线程对某一个程序的可共享资源的访问是否会出现共享资源的值发生错乱的现象。
4.1.2. 线程同步
以存取款为例。
4.2. 实现线程同步的三种方法
4.2.1. 同步代码块
Synchronized(obj){
。。。。。。
//此处代码块就是同步代码块
}
Synchronized中的obj是同步监听器,线程在开始执行同步代码块之前,必须先获得对同步监听器的锁定。同步监听器一般是线程可共享的资源。代码详见16.5的DrawlThread.java。
4.2.2. 同步方法
在方法前面加上synchronized。同步监听器是当前对象this。
4.2.3. Lock
自己看代码。16.5.5
5. 线程通信
5.1. 对于存在同步监听器的线程通信
Wait();notify();notifyAll()
Wait()使但当前线程等待,并释放同步监听器的锁定。
Notify()唤醒在同步监听器上等待的单个线程。
5.2.对于加锁的线程同步通信
6. 生产者消费者模型