多线程01(三)

简介: 多线程01

6.7suspend&resume方法.

  • suspend() & resume() : 这两个操作就好比播放器的暂停和恢复。二者必须成对出现,否则非常容易发生死锁。suspend()调用会导致线程暂停,但不会释放任何锁资源,导致其它线程都无法访问被它占用的锁,直到调用resume()。已过时,不建议使用。取而代之的是wait()、notify()、notifyAll().

6.8wait&notify&notifyAll方法.

  • 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后,还会有如下三种情况之一的操作:
  1. 如果是wait、sleep以及jion三个方法引起的阻塞,那么会将线程的中断标志重新设置为false,并抛出一个InterruptedException;
  2. 如果是java.nio.channels.InterruptibleChannel进行的io操作引起的阻塞,则会对线程抛出一个ClosedByInterruptedException;(待验证);
  3. 如果是轮询(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. 设计两条线程,分别打印1-100之间的偶数和奇数.


  1. 例子2
  • 声明一个匿名内部类继承Thread类,重写run方法,实现打印[1,100]之间的偶数,要求每隔1秒打印1个偶数。
  • 声明一个匿名内部类继承Thread类,重写run方法,实现打印[1,100]之间的奇数,
  • 当奇数线程打印到5时,让奇数线程暂停一下,再继续。
  • 当奇数线程打印到5时,让奇数线程停下来,让偶数线程执行完再打印。

相关文章
|
7月前
|
安全 Java C++
多线程问题(四)
多线程问题(四)
42 0
|
安全 Linux C++
C++多线程
C++多线程
57 1
|
存储 安全 Java
今天聊聊多线程
今天聊聊多线程
46 0
|
调度 C++
多线程
多线程
|
安全 C++
C++多线程(二)
C++多线程
154 0
|
Linux API 调度
C++之多线程(一)
C++进阶之多线程上
122 0
|
算法 Java 调度
多线程二 基本技能
多线程二 基本技能
117 0