[Java]多线程
#### 10.多线程
①理解程序、进程、线程的概念
程序可以理解为静态的代码
进程可以理解为执行中的程序
线程可以理解为进程的进一步细分,程序的一条执行路径
②创建java程序的线程
方式一:继承于Thread类
方式二:实现Runnable接口
③两种方式的对比:联系:class Thread implements Runnable
比较哪个好?实现的方式较好。
①解决了单继承的局限性。
②如果多个线程有共享数据的话,建议使用实现方式,同时,共享
数据所在的类可以作为Runnable接口的实现类。
④线程里的常用方法:
start() run() currentThread() getName() setName(String name) yield() join() sleep()
isAlive() getPriority() setPriority(int i) wait() notify() notifyAll()
⑤线程的生命周期
新建---(start)---就绪-----(获取CPU/失去CPU执行权)运行-----(正常执行结束;Error/Exception未处理;stop)死亡
运行-----(sleep;等待同步锁;wait/join;suspend,即挂起)---阻塞
阻塞-----(sleep时间到;获取同步锁;notify/notifyAll;resume,即释放)----就绪
⑥线程同步
1.存在原因:
由于一个线程在操作共享数据时,未执行完毕的情况下,了另外的线程参与进来,导致共享数据存在了安全问题
2.解决办法
必须让一个线程操作共享数据完毕后,其他线程才有机会参与共享数据的操作
3.JAVA实现线程安全------线程同步
方式1:同步代码块
synchronized(同步监视器){
//需要被同步的代码块
}
1.共享数据:多个线程共同操作一个数据
2.同步监视器:由一个类的对象来充当,哪个线程获取此监视器,谁流执行被同步的代码块,
俗称,锁(任何类的对象都可充当该锁)。但是该锁在多线程中必须唯一.
在一般方法内,可以使用this;在静态方法内,使用当前类本身充当锁
方式2:同步方法
将共享数据的方法声明为synchronized,即此方法为同步方法,能够保证当一个线程执行此方法时,其他线程在外等待,直至次线程完成方法
⑦线程的通信
wait;notify;notifyAll 这三者只有在synchronized方法或代码块中使用,否则出现java.lang.IllegalMonitorStateException
wait():当在同步中,执行到此方法,则此线程“等待”,直至其他线程执行notify()的方法,将其唤醒,唤醒后继续其wait()后的代码
notify()/notifyAll():在同步中,执行到此方法,则唤醒其他的某一个或所有的被wait的线程。