多线程基本概念解析

来源:互联网 发布:mac 修改计算机名称 编辑:程序博客网 时间:2024/06/06 02:59

1、多线程的状态

线程一共有8种状态,听我慢慢道来

1、new状态 :当一个线程实例出来之后(调用start方法之前),改线程并未运行

2、Runnable(就绪状态):调用start之后,就进入就绪状态,cpu随机将资源分配给就绪状态的线程(一般会有很多就绪状态线程在焦急等着cpu的资源,java是属于抢占式的时间片分配,这样就没有哪个线程可以长期独占cpu资源),让其运行。(资源只有1个,及其珍贵啊)

3、Runing   运行状态、大家也知道,单核cup每次只能执行一条线程的一条指令,所以宏观上的并发,实际是微观上的串行

4、Blocked状态:  阻塞状态,当一个线程运行时,碰到了突发事件,如  io阻塞,或者须要等待其他资源完成 后才能继续,该线程就处于阻塞状态,此时,如果有其他线程,其他线程也照样正常运行。

5、Look pool 状态:当一个线程要访问一个对象方法时,发现这个对象已经被锁(Synchronized,lock),因此就进入Loo pool状态,当发现解锁时,look pool状态的线程立刻回到Runnable状态。

6、wait pool状态:当一个线程调用了wait的时候,就进入wait pool(同时释放它所占领的锁),当被其他线程调用notify时,被唤醒,进入Lock pool状态。

7、dead状态:死亡状态,正常结束(run方法执行完)或者异常退出。

2、sleep()、wait()notify()、stop()、synchronized()、join()、lock()、interrupt()、yeild()(概述,记住是概述,详情还得自己去找)

1、sleep():这个方法大家用得比较多,就是一个线程暂停睡眠多少秒,然后接着执行。调用完后它进入Blocked状态。

2、wait():与sleep()相提并论的方法就是wait()方法了,他们的区别网上很多,我总结下A、sleep自己醒来进入Runnable状态,wait必须等别人来呼唤他(notify),然后才进入相应下一个状态B、如果一个线程拿到一个对象锁,他调用sleep方法后,锁是不会被释放的,而调用wait时,对象锁是会被释放的。这个是他们2个中最主要的差别。

3、synchronized():这个就是同步锁啦,用法很简单,但是知识点很多,自己理解百度去。

4、lock():这个也是锁的一种方式,必须运行在try 语句块,锁的关闭必须在finally语句块中,jdk5的新特性,经常拿来和synchronized比,知识点很多,自己百度理解去。

5、stop():停止一个线程的方法,已不推荐使用。如何停止一个线程?这又是一个知识点,请百度

6:interrupt():看名字就知道,是中断一个线程。其他中断方法是不推荐的,只有这个才是王道,当然中断也要看中断线程处于什么状态,当改线程正常运行时,外部线程调用该线程的中断方法,改线程会有一个中断状态,相当于一个boolean变量,变成false,该线程执行业务的时候,就会判断该状态,其实这个中断方法我们可以自己设置一个boolean来替代他。另外一个场景就是当一个线程调用了sleep  wait  join 的时候,你再调用该线程的interrupt方法,那么就直接中断了,中断的时候抛出个异常,详情见http://www.iteye.com/topic/429005

7、join():在A线程运行的时候,调用另外一个线程(用B称呼吧)的join方法,那么,他自己就进入阻塞状态,要等到B的run方法运行完,A才接着往下运行。挺好理解的,自己写个程序就理解透了。

8、yeild();这个方法不是很好理解,实验也不知道如何做,就是说 当一个线程运行,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。(网上摘抄的,暂且急着吧)




零散的点:

synchonized可以是锁一个方法,也可以是锁一个语句块,但是无论何种方式,都是对一个对象加锁。另外一种加锁就是对Class对象加锁,这又是另外一种级别了、如果你对一个类的静态方法加锁,那么就是锁的改类的Class对象了。


这是一张线程状态图: