——每天的寥寥几笔,坚持下去,将会是一份沉甸甸的积累。
上一篇讲到了多线程的创建和使用,以及synchronized关键字的使用和注意点,那都是基础知识。
今天再来说说多线程的几个方法和中断操作(属于中级知识,本文内容不多,但都是本人总结的一些关键点,如果还是不清楚可以去详细查下相关知识,很重要)。
1.常用函数
void wait()
导致线程进入等待状态直到被通知唤醒,只能在一个同步方法中被调用。
如果当前对象不是对象锁的持有者,该方法抛出一个IllegalMonitorException
void notify()
随机解除一个在该对象上调用wait方法的线程的阻塞状态,该方法只能在通步方法或同步块中被调用。
如果当前对象不是对象锁的持有者,该方法抛出一个IllegalMonitorException
void notifyAll()
解除所有那些在该对象上调用wait方法的线程的阻塞状态,该方法只能在通步方法或同步块中被调用。
如果当前对象不是对象锁的持有者,该方法抛出一个IllegalMonitorException
void wait(long millis,[int nanos])
导致线程进入等待状态直到被通知或经过指定的时间,该方法只能在同步方法中被调用。
如果当前对象不是对象锁的持有者,该方法抛出一个IllegalMonitorException
void interrupt()
向线程发送中断请求,线程的中断状态将被置为true。
如果目前该线程被调用阻塞(sleep,wait,join),则会抛出一个InterruptException异常
static boolean interrupted()//慎用
测试当前线程是否处于中断状态。同时会将中断状态置为false。
boolean isInterrupted()
测试当前线程是否处于中断状态。不会让中断状态发生变化。
2.明确中断的含义。
线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段,不但不是让线程停止运行,反而是继续执行线程的手段。
说白了,interrupt函数的调用只是“委婉地提醒该对象,你的中断位已被置为true,这时你可以通过isInterrupted()监听到,建议你采取相应的处理措施”。但至于该对象怎么做,其他线程都无法干预。
3.注意InterruptedException
当抛出InterruptException后该对象的中断位会被置为false。也就是说抛出异常,进入catch内部时,中断已经不是原来的true了,这样会改变原来被中断的状态而使得isInterrupted()无法监听到,这种改变原意的行为是危险的,因此建议,在catch内部加上一句Thread.currentThread.interrupt(),再一次将中断位置为false