java学习笔记之线程

这是对线程学习的一个初步总结,备忘:
线程:线程和进程对于操作系统来说是透明的的,即线程是另一种意义上的进程,线程也可以说是一个程序的多个执行路径,线程可以共享进程的内存。

同步与异步的概念:
同步:必须一件一件事做,等前一件做完了才能做下一件事。
异步:两件事是毫无关系的,可以同时进行。
举个例子:俩人都要洗澡,如果只有一个卫生间,那么久必须等其中一个人洗完,另一个人再去洗,这就是同步,而假如有俩个卫生间的话,
俩人就可以各洗各的,这就是异步。

Synchronized :
方法控制对类成员变量的访问;
Java中的每一个对象都有唯一的一个内置的锁,每个Synchronized Block/方法只有持有调用该方法被锁定对象的锁才可以访问,
否则所属线程阻塞;
机锁具有独占性、一旦被一个Thread持有,其他的Thread就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,
直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
注意:1.Java中的多线程是一种抢占机制而不是分时机制。抢占机制指的是有多个线程处于可运行状态,但是只允许一个线程在运行,他们通过竞争的方式抢占CPU
2.不建议继承thread类来定义线程,因为采用这种方式就不能再继承其他的类了,扩展性差。
3. Synchronized声明不会被继承,如果一个用synchronized修饰的方法被子类覆盖,那么子类中这个方法不在保持同步,除非用synchronized修饰。
生命周期:
生命周期图解
1.通过new方法创建线程
2.通过start方法启动线程进入就绪状态
3.系统调度,run方法运行线程
4.正常结束
5.sleep()方法,当前线程进入等待状态,直到过了一段指定时间,线程进入就绪状态(保持对象锁,让出cpu,即给其他线程只执行的机会)
6.join方法,调用线程将阻塞,直到目标线程完成为止,进入就绪状态。
7.等待io
8.yield()方法,将cpu让出,进入就绪状态队列,即只有存在优先级比其更高或者相同的线程时,yield才会起作用。
9.wait()方法,进入相关对象的等待池中,这是对象的wait方法,当前线程必须拥有对象的锁,因为wait要返还对象锁,否则会抛出异常。
几种方法的区别:
join():将指定线程加入的当前线程,当指定线程执行完毕后,才会继续执行当前线程。(即异步变同步)
yield():将cpu让给优先级更高的线程。
object.wait():当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,
wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,
所以wait()必须在synchronized block中调用。
object.notify()/notifyAll():唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,
否则也会抛出IllegalMonitorStateException异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值