进程好像是一座房子,房里面卧室、厨房、卫生间等等。
但是这个房子里面居住的我们亲戚朋友和兄弟姐妹,却可以利用这个房间干很多事情,他们就是一个一个的线程。
如只有你一个人住在房子里面,那么你就可以为所欲为,把所有的空间占为己有:用卫生间、洗澡等等,这就是“单线程”,即Single Threaded.
你终于不甘寂寞,屋子里面人多了,这就是多线程,Multi Threaded。
你们好几个Thread在一起,共用这个房间的空间(一个Process的内存空间对于Thread是共享的),相安无事,和谐共处。
可是问题来了,大家可以共享房间的空间,但是并不表示多个人可以同时占用一个空间,比如厕所,一次只能去一个人,所以为了防止多人同时进入的情况,
因此每个人上厕所的时候,都会在门口挂一个锁,名字叫“Mutual exclusion”(互斥锁),防止多个Thread同时去使用一个内存空间,等候的Thread进入阻塞状态,只有一个Thread用完后(释放锁),其他Thread才可以用。
有些地方大家都能去,但空间有限,只能去固定的人数,比如厨房,去的人多了,容不下,因此会在门口挂上几把钥匙,进去一个人取一个钥匙,
出来的时候再把钥匙给放在原地,所以厨房人满的时候,后面要进的人,一看没有钥匙,就会在门口等待了(进入阻塞状态),这种做法叫做:Semaphore(信号量)。
进程是操作系统分配资源的单位,一个进程就是一个程序,一个进程至少包含一个线程。
线程由CPU调度,优先级高的线程将优先执行,一个线程的优先级设置遵从以下原则:
线程创建时,子继承父的优先级。
线程创建后,可通过调用setPriority()方法改变优先级。
线程的优先级是1-10之间的正整数。
1- MIN_PRIORITY
10-MAX_PRIORITY
5-NORM_PRIORITY
如果什么都没有设置,默认值是5。
但是不能依靠线程的优先级来决定线程的执行顺序。
线程的调度策略
线程调度器选择优先级最高的线程运行。但是,如果发生以下情况,就会终止线程的运行:
线程体中调用了yield()方法,让出了对CPU的占用权。
线程体中调用了sleep()方法,使线程进入睡眠状态。
线程由于I/O操作而受阻塞。
另一个更高优先级的线程出现。
在支持时间片的系统中,该线程的时间片用完。
线程的状态及生命周期