多线程:
1概念:多线程:允许多个线程并发执行,提高程序运行效率
进程:就是一个独立执行的程序.打开任务管理器,就可以看到各种进程.系统总是分配给每一个进程一段有限的使用CPU的时间,这段时间称之为CPU时间片,CPU在这段时间只会执行某个进程,然后在下一个时间片又随机跳转到另外一个进程中取执行,由于CPU切换很快,所以我们会觉得每个进程好像是同时进行的.
而一个线程则是进程中的执行的流程,一个进程可以同时包含多个线程,每个线程也可以随机得到一段CUP的执行权.和CPU在进程中切换的模式一样,当CPU进入到一个进程中,它会在各个线程间随机切换执行,切换速度很快,同样好像是同时执行一样,这就是多线程的并发执行.
在单线程中,程序代码按照调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程.单核的CPU,多个线程或进程不可能同时执行,多核的CPU下,可以同时执行.单核和多核的概念,就像是一个人不可能同时完成吃饭和睡觉,多个人就可以了.
2.动态理解线程的运行状态
一个线程一旦被创建,就立即进入运行状态.在运行过程中,如果被sleep或者wait就进入冻结状态(包括睡眠状态和等待状态),也就是说此时该线程放弃了执行资格.在冻结状态和运行状态之间还存在着阻塞状态.该状态是临时状态,也就是线程拥有运行资格,但没有执行权,它在等待CPU执行权的到来.当在冻结状态中的线程被notify或者sleep时间结束后,并不是马上进入运行状态,而是先进入阻塞状态,当CPU执行权到来的时候才回到运行状态.最后就是消亡状态,当线程被stop()或者run()方法结束后就进入消亡状态.
3.创建线程的两种方式
<1>.继承Thread类,并复写run()方法,然后用start()方法开启线程.
<2>.实现Runnable接口,复写run()方法,然后用new Thread()封装,在用start()开启.
4.线程的同步
<1>. 多线程并发时,即同时访问共享数据时,为了防止由于CPU的随机切换而造成的延迟性操作异常,必须上锁,.格式为:
synchronized (锁对象) {同步代码} 锁对象相同的同步代码同一时间只有一个线程可以执行, 其他线程等待
使用"synchronized"关键字修饰一个方法, 那么整个方法中的代码都是同步的, 使用"this"作为锁对象.
<2>. 使用Lock接口的子类来进行同步
lock()方法为开始同步
unlock()方法为结束同步. 为了避免出现异常不能执行, 最好放在finally代码块中执行
5.线程间通信
<1>. JDK1.4以及之前
在synchronized (锁对象) {同步代码}中
使用锁对象的wait()方法开始等待
使用锁对象的notify()方法唤醒随机一个等待的线程
使用锁对象的notifyAll()方法唤醒所有等待的线程
<2>.JDK1.5出现之后
针对synchronized不能唤醒指定线程的缺点,新锁Lock和Condition出现了.
Condition将Object监视器方法wait,notify,notifyAll分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,其中,Lock替代了synchronized的方法用,Condition 替代了Object监视器方法的使用.
用法如下:
使用Lock的newCondition()方法可以创建一个Condition对象
使用Condition对象的await()方法等待
使用Condition对象的signal()方法唤醒指定一个线程