lesson x

先讲明白第一个问题:
线程被创建出来后,并没有运行。
创建后调用start()方法,也没有立刻运行,而是变为了可运行的状态。
所有线程都是可运行的状态,坐在等待席,等待CPU大人叫号,叫到的运行,没叫到的等着。

被CPU大人选中后,正在占用CPU的人,状态是正在运行。但是CPU不会让你待太久,考虑到其他等待席上的线程的心情。CPU会频繁的将等待席中的线程叫进来,让它运行会。
从CPU上被换下的线程,状态又变为可运行,等待再次叫号。

调用线程的yield()方法,就相当于学雷锋,告诉CPU大人,这个线程不急,下次叫号的时候,优先考虑其他线程。


运行完的线程,状态变为中止。
如果线程运行中,产生了异常,则线程也会结束,状态变为中止。


线程在运行过程中,有可能需要等待其他线程的状况。
比如,有一个线程占用了一个同步化的对象,它会上个锁。
那么其他线程需要访问这个对象时,就会需要等待,等它用完后,把锁释放出来,其他线程才能继续进入可运行状态。

调用某个线程的join()方法,相当于要强行等待某个线程先完成。通常用于,明确的知道某线程必须要先执行完,才能执行的情况。

可以调用Thread.sleep()方法,强行让自己等待一段时间,再次进入可运行状态。


如果多个线程同一时刻,同时调用了一个对象的方法,或者修改了一个对象的属性,这就会产生问题。
所以我们需要有个语法,让某个对象的某个方法,或者某段代码,同一时间,只能有一个线程能进来。其他的都带等着。这就是同步,synronized。


但是这又带来一个问题,就是如果进入到synronized的线程,运行过程中,需要获得某个条件才能继续下去。而能改变这个条件的线程,恰好又是等待进入该synronized的,这就会出现A等B开口,B等A开口的死锁情况。
在synroized代码块中,可以通过调用锁对象的wait()方法,把锁释放出来,让其他想进入synroized的线程获得运行的机会。当其他线程运行的差不多了,可以调用notify()方法,唤醒其他等待线程。







猜你喜欢

转载自hellobbboy.iteye.com/blog/2392260