[Java]多线程

2019-10-11  本文已影响0人  芒果奶油卷

#### 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的线程。

上一篇 下一篇

猜你喜欢

热点阅读