多线程
并发和并行:
并行:指两个或多个事件在同一时刻点发生;
并发:指两个或多个事件在同一时间段内发生。
进程和线程:
进程:是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间
多任务系统,该系统可以运行多个进程,一个进程也可以执行多个任务,一个进程可以包含多个线程.
一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个执行任务,即多线程。
创建和启动线程,传统有两种方式:
方式1:继承Thread类;
方式2:实现Runnable接口;
1. 线程(Thread)不能重复开启
2. 五种状态
a) 创建:MyThread mt = new MyThread()
b) 就绪:mt.start() -> 不是马上执行,进入线程池
c) 运行:抢到CPU的执行权
d) 堵塞:失去CPU的执行权
e) 死亡:不具有继续运行的能力
3. 实现Runnale接口的方式,必须借助Thread类来运行线程
4. Runnale可以共享对象
5. 一个java程序中至少有2个线程:主线程和垃圾回收线程
6. 线程操作的常用方法
a) is Alive() 判断是否处于活动状态
b) sleep() 线程休眠
c) join() 强制执行线程
d) interrupt() 中断线程某种状态,使之回到运行状态
7. 通过Thread类创建线程,并将实现Runnable接口的子类对象作为参数传递给Thread类的构造函数
8. 线程安全问题
a) 原因:数据共享 多步操作
b) 解决方案:同步代码块 同步函数 Lock锁机制(只有锁相同,才能同步)
c) Java中同步方法的锁就是this
d) Lock锁机制因为没有同步锁,所以不能使用wait() 和 notify()方法
9. 一个线程只能处于一种状态
10. 线程休眠:执行的线程暂停一段时间,进入计时等待状态sleep(). 调用sleep()后,当前线程放弃CPU,在指定时间段内sleep()所在线程不会获得执行机会。此状态下的线程不会释放同步锁/同步监听器
11. 继承方式和实现方式的区别:
继承方式:
1):Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
3):从多线程共享同一个资源上分析,继承方式不能做到.
实现方式:
1):Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口
2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.
3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).
多线程—同步
线程的安全问题
a) 同步代码块
(http://img.blog.csdn.net/20171112102055613?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXZlbl8wODE3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
b) 同步函数
(http://img.blog.csdn.net/20171112102207623?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXZlbl8wODE3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
c) Lock锁机制
二、 同步锁
a) 对于非static方法,同步锁就是this.
b) 对于static方法,我们使用当前方法所在类的字节码对象