|
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-03-23
yield 的实现代码其实就是 sleep ( 0 ). 即暂停一下, 然后进入就绪队列(Ready Queue). 随时可以恢复运行.
yield, sleep 用 pause 这个词, 其实更合适. yield 虽然名为放弃,其实却并没有放弃同步锁的争夺权.暂停几秒之后, 照样生龙活虎, 跃跃欲试.而不象 lock.wait那样自暴自弃,把命运控制权拱手相让. lock.wait是把自己彻底打入冷宫(Waiting Queue, 待诏队列).除非有其他线程发扬风格,次奥用lock.notify,否则调用了lock.wait的线程,将永远不见天日,呆在 waiting queue里面发霉. -------------------------- 终止线程, 最好正常结束Thread或者Runnable的run方法. 比如,可以设一个标志位 stop.这个标志位可以在外部设置.比如, thread.setStop(). 在thread/runnable的run方法的程序中的关键点(比如循环体内的第一条指令,或者循环条件)加上这样的判断语句 if(stop) return |
|
| 返回顶楼 | |
|
时间:2008-03-25
http://www.ibm.com/developerworks/java/library/j-jtp05236.html
从这篇文章的角度看,停止线程好的方法是要让自己成为可停止的。 1.在长的循环过程中,Thread.isInterrpt()检查中断状态。 2.中断异常捕获时的处理:方法抛出InterruptedException的,那么方法的调用者,重新抛出或Thread.interrpt()。 3.如果涉及Socket等阻塞操作,通过关闭socket引致IO异常,进而退出阻塞状态。 |
|
| 返回顶楼 | |
|
时间:2008-04-02
设置标志位有时会出问题,比如当一个操作被阻塞的时候,此时线程将无法检测到状态位的改变,所以最好用interrupt()来中断线程.
|
|
| 返回顶楼 | |
|
时间:2008-04-02
设置标志位,线程完全可能在没有运行到检测标志位的地方就阻塞了,对于取消线程的标准方法,在《java并发编程实践》中有深入而详细的讨论,nihongye给出的链接,其实作者是同一人,内容也基本也一样。
|
|
| 返回顶楼 | |
|
时间:2008-04-08
操作系统的PV原语 在作者笔下如此精湛;实在不易
|
|
| 返回顶楼 | |
|
时间:2008-04-11
太好的文章了,把几个基本概念和线程的一些机制说的很明白。
首先是几个概念,线程,同步资源,同步锁。其中同步资源,同步锁都是线程需要竞争的资源。但是线程首先得到同步锁,才能得到同步资源(即线程到达运行态)。 其次是线程的一些机制。线程有几个状态,这里涉及三个主要的:就绪态,阻塞态和运行态。这三个状态有转换关系,此文涉及其中几个。就绪态到运行态,运行态到阻塞态,阻塞态到就绪态。但是必须注意,阻塞态不能直接到运行态。 java中object reference可以是同步锁和信号量。线程要想执行,首先必须处于就绪态中,其次得到同步锁。于是同步锁后面就有几个线程队列,比如就绪线程的队列,阻塞线程的队列。就绪队列很简单,关键是阻塞队列。 首先线程A从就绪态得到对象锁(同时也得到信号量),线程A进入运行态。当线程A执行到同步锁对象的wait()时,线程A放弃信号量(同时放弃同步锁),线程A从运行态到阻塞态(不是就绪态)。这时其它在同步锁就绪队列里的线程B就有机会得到同步锁,进入运行态,得以执行同步对象的notify()(此时线程A从阻塞态到就绪态,有机会得到同步锁进入运行态)。线程B继续执行,直到他放弃同步锁。这时线程A(已经在就绪队列里等待了)就有机会得到同步锁,从而继续刚才没有执行完的代码。 希望楼主多发此类好文章! |
|
| 返回顶楼 | |
|
时间:2008-04-12
不是还有Lock和Condition吗?
|
|
| 返回顶楼 | |
|
时间:2008-04-14
写得真好!透彻,易懂!
|
|
| 返回顶楼 | |
|
时间:2008-04-29
不错,用简单的语言描述了复杂的事物
|
|
| 返回顶楼 | |










