您的位置:首页 > 编程语言 > Java开发

java学习笔记之线程

2015-06-30 15:27 603 查看
这是对线程学习的一个初步总结,备忘:

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

同步与异步的概念:

同步:必须一件一件事做,等前一件做完了才能做下一件事。

异步:两件事是毫无关系的,可以同时进行。

举个例子:俩人都要洗澡,如果只有一个卫生间,那么久必须等其中一个人洗完,另一个人再去洗,这就是同步,而假如有俩个卫生间的话,

俩人就可以各洗各的,这就是异步。

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异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: