Java多线程一直是Java学习的重点与难点,本人今天重点学习Java高并发一书,对其中的知识点做一个梳理。
本文脉络:主要介绍终止线程与中断线程的几种方式,终止线程中stop被遗弃,而用stopMe+break的定义方式,同时推荐使用抛出中断异常的方式。中断线程的三个方法(主要用第一个,第二个),一个中断,一个检查中断返回TRUE,两个都是非静态方法。
Java基本的线程控制
1.开始线程:extends thread 与 implements runnable
2.终止线程:stop()(但jdk已废弃):使用方式:
stop作废的原因:当一个写线程对数据操作时,刚要写入时,此线程终止(数据未写入但锁已释放),另一个读线程读取此数据,便发生数据不一致问题。
线程终止方式:设置stopMe()方法,并用break返回。
但这个地方只是终止了for循环的执行,假设for后面还有执行语句,如何全部停止(不使用return)?
异常法:
3. 线程中断:线程中断并不会使线程马上退出,而是给线程发送一个通知,告诉线程有人希望你退出了。而目标线程收到通知后如何处理,则完全由主线程自行决定。
三个主要方法:thread.interrupt()中断线程:通知目标线程中断并设置中断标志位为true.
thread.isInterrupted()判断是否被中断:判断当前线程是否中断(通过检查中断标志位)
Thread.interrupted()判断是否被中断并清除当前中断状态:判断当前线程是否中断同时清除中断位。
首先,如果我们仅仅使用interrupt,是无法中断线程的,如下:
需要加入isInterrupted()判断
但这里中断位也都是FALSE,因为调用的是当前线程main,所以是FALSE。
这样第一个就为TRUE,对于第二个为FALSE。因为interrupted不光判断,还会将标志位变为清除,也就是变为false。
正确的做法:
同时又出现问题:程序虽然中断(抛出中断异常),但后面的输出仍然继续,这就牵扯到如下:
线程在sleep中中断异常:
在线程sleep时被中断,线程自动标志位为false,所以,继续for循环仍然可以执行,修噶为:
说明:1.所有在main线程下定义的线程都是其子线程,在main方法中执行的代码都是主线程在执行,调用Thread.currentThread也可以很明确的看到。
2.main中定义线程,这时jvm中就维护着两个线程了,sleep表示当前线程休眠,且必须抛出中断异常(检查时异常),而interrupt表示目标线程中断,isinterrupted表示当前线程中断,一定要理解明白。
3.throw new exception表示生成异常,throws exception表示捕获异常。
4.分析多线程,一定要了解有几个线程、每个线程在干什么、多核的话多个线程可以同时运行、线程方法的作用等。