Thread.join(),源码的说明Waits for this thread to die.
即等待调用该方法的线程结束,再执行;主线程等待调用join方法的子线程执行结束后再继续执行。
B extends Thread
A extends Thread {
run(){
b.join();//等待B线程结束
//b.join(1000);//等待B线程结束或者1000ms超时
System.out.println("a线程继续执行!");
}
---------------
1. sleep() & interrupt()
线程A正在使用sleep()暂停着: Thread.sleep(100000);
如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用
a.interrupt();
令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例
执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt().当sleep中的线程被调用interrupt()时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程.
2.interrupt()只是改变中断状态而已
interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException.
若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的
如果线程自己调用自己的interrupt()方法,那么只是设置了下状态值而已
http://macleo.iteye.com/blog/626283,还可以的一篇文,有时间继续看下
---------------------------
Reentrantlock相关
http://www.dewen.org/q/9077,lock,tryLock,tryLock(long timeout, TimeUnit unit),lockInterruptibly()的区别
http://www.cnblogs.com/MichaelPeng/archive/2010/02/12/1667947.html,Reentrantlock代码解析