java核心卷之多线程核心部分学习笔记(二)

——每天的寥寥几笔,坚持下去,将会是一份沉甸甸的积累。


上一篇讲到了多线程的创建和使用,以及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



发布了52 篇原创文章 · 获赞 9 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章