1 sleep和yield的区别在于, sleep可以使优先级低的线程得到执行的机会, 而yield只能使同优先级的线程有执行的机会.
2 interrupt方法不会中断一个正在运行的线程.就是指线程如果正在运行的过程中, 去调用此方法是没有任何反应的. 为什么呢, 因为这个方法只是提供给 被阻塞的线程, 即当线程调用了.Object.wait, Thread.join, Thread.sleep三种方法之一的时候, 再调用interrupt方法, 才可以中断刚才的阻塞而继续去执行线程.
3 join() 当join(0)时等待一个线程执行直到它死亡返回主线程, 当join(1000)时主线程等待一个线程1000纳秒,后回到主线程继续执行.
4 waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
同步锁何时释放
任何线程进入同步代码块、同步方法之前,必须获得同步监视器的锁定,那么何时会释放这个锁定呢?在程序中,是无法显式释放对同步监视器的锁的,而会在如下几个情况下释放锁。
1、当前线程的同步方法、代码块执行结束的时候释放
2、当前线程在同步方法、同步代码块中遇到break 、 return 终于该代码块或者方法的时候释放。
3、。。。。出现未处理的error或者exception导致异常结束的时候释放
4、。。。。程序执行了 同步对象 wait 方法 ,当前线程暂停,释放锁
如下情况是不会释放锁的:
1、。。。。。。程序调用 Thread.sleep() Thread.yield() 这些方法暂停线程的执行,不会释放。
2、线程执行同步代码块时,其他线程调用 suspend 方法将该线程挂起,该线程不会释放锁 ,所以我们应该避免使用 suspend 和 resume 来控制线程
262

被折叠的 条评论
为什么被折叠?



