6.7suspend&resume方法.
- suspend() & resume() : 这两个操作就好比播放器的暂停和恢复。二者必须成对出现,否则非常容易发生死锁。suspend()调用会导致线程暂停,但不会释放任何锁资源,导致其它线程都无法访问被它占用的锁,直到调用resume()。已过时,不建议使用。取而代之的是wait()、notify()、notifyAll().
6.8wait¬ify¬ifyAll方法.
- wait():线程等待,可以传入参数指定等待时间。线程等待的时候会释放当前占用的锁,这也是和suspend方法最大的区别。
- notify:唤醒当前线程;
- notifyAll:唤醒所有线程。
6.9isAlive方法.
- isAlive方法是判断线程是不是处于活动状态。
- 注,如果线程处于阻塞状态也属于活动状态。
6.9.1案例1-判断线程死亡之后是否还处于活动状态.
- 案例如下:
- 一开始线程处于活动状态,当2秒过后线程已经运行结束,就处于未活动状态(死亡了)。
6.9.2案例2-判断线程sleep过程中是否处于活动状态.
- 一开始线程肯定处于活动状态,当线程运行一次,然后休眠10秒钟(sleep),再休眠未结束期间线程仍处于活动状态。
6.9.3案例3-判断线程wait是否处于活动状态.
- 线程运行到第五秒的时候处于等待状态(wait),但仍是活动状态。
6.9.4案例4-判断线程被join后是否处于活动状态.
- 一开始线2程肯定处于活动状态,当线程1加入执行的时候,线程2处于阻塞状态(join),但仍然是活动状态。
7.0 interrupt&interrupted&isinterrupted方法的区别.
7.0.1interrupt方法.
- interrupt 方法是打断活动状态的线程。
- 详解:要中断一个Java线程,可调用线程类(Thread)对象的实例方法:interrupte();然而interrupte()方法并不会立即执行中断操作;具体而言,这个方法只会给线程设置一个为true的中断标志(中断标志只是一个布尔类型的变量),而设置之后,则根据线程当前的状态进行不同的后续操作。
- 情况1:如果线程的当前状态处于阻塞状态,那么在将中断标志设置为true后,还会有如下三种情况之一的操作:
- 如果是wait、sleep以及jion三个方法引起的阻塞,那么会将线程的中断标志重新设置为false,并抛出一个InterruptedException;
- 如果是java.nio.channels.InterruptibleChannel进行的io操作引起的阻塞,则会对线程抛出一个ClosedByInterruptedException;(待验证);
- 如果是轮询(java.nio.channels.Selectors)引起的线程阻塞,则立即返回,不会抛出异常。(待验证)。
- 情况2:如果线程的当前状态处于非阻塞状态,那么仅仅是线程的中断标志被修改为true,而在此基础上,一旦进入阻塞状态,则按照阻塞状态的情况来进行处理;例如,一个线程在运行状态中,其中断标志被设置为true,则此后,一旦线程调用了wait、jion、sleep方法中的一种,立马抛出一个InterruptedException,且中断标志被清除,重新设置为false。
- 通过上面的分析,我们可以总结,调用线程类的interrupted方法,其本质只是设置该线程的中断标志,将中断标志设置为true,并根据线程状态决定是否抛出异常。因此,通过interrupted方法真正实现线程的中断原理是:开发人员根据中断标志的具体值,来决定如何退出线程。
- 补充:interrupte方法的调用,该方法可在需要中断的线程本身中调用,也可在其他线程中调用需要中断的线程对象的该方法。
- 案例演示1-打断非阻塞状态线程,然后在该线程内部通过判断打断标记停止线程,并处理后事和获取打断标记.
- 执行效果如下:
- 线程被打断后打断标记变为 true,这就是打断非休眠状态下的线程效果。
- 案例演示2-打断阻塞状态线程,并获取打断过后的打断 .
- 运行效果如下:
- 从结果上可以发现,线程在休眠前和休眠被断后的打断标记都是false,这是因为 interrupt方法在打断休眠状态的线程后又会把线程的打断标记重置为false。
7.0.2interrupted方法.
- interrupted()方法是 Thread类里面的静态方法,判断当前执行线程是否停止,会获取先的打断标记,获取完之后又会重置该线程的打断标记为:false。
- 举例:当一条线程被打断后,如果执行两次interrupted()方法获取线程的打断标记,第一次输出的是 true,第二次输出的则是 false。
7.0.isinterrupted方法.
- 是对象方法,判断该对象是否已经停止,会获取线程的打断标记,但不会重置线程的打断标记。
- 该方法和interrupted()方法的区别就是该方法不会重置线程的打断标记为false,而interrupted()方法则会重置为false。
7.线程的生命周期.
7.1JDK1.5之前.
- 新建: 刚new出来在内存中
- 就绪: start表示该线程有资格抢CPU!
- 运行: 抢到了CPU,会执行run方法
- 阻塞: 调用了sleep方法或其他阻塞的方法
- 死亡: 执行完run方法
7.2JDK1.5开始.
- 6个阶段
8.例子
- 设计两条线程,分别打印1-100之间的偶数和奇数.
- 例子2
- 声明一个匿名内部类继承Thread类,重写run方法,实现打印[1,100]之间的偶数,要求每隔1秒打印1个偶数。
- 声明一个匿名内部类继承Thread类,重写run方法,实现打印[1,100]之间的奇数,
- 当奇数线程打印到5时,让奇数线程暂停一下,再继续。
- 当奇数线程打印到5时,让奇数线程停下来,让偶数线程执行完再打印。