多线程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时,让奇数线程停下来,让偶数线程执行完再打印。

相关文章
|
6月前
|
并行计算 调度 UED
为什么要用多线程?
为什么要用多线程?
70 0
|
安全 Java
多线程02
多线程02
|
22天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
6月前
|
Web App开发 IDE Java
什么是多线程
什么是多线程
45 3
|
11月前
|
安全 Linux C++
C++多线程
C++多线程
52 1
多线程
java多线程是指在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。Java中所有变量都储存在主存中,对于所有线程都是共享的。Java中的多线程可以通过继承Thread类或者实现Runnable接口来创建,然后通过start()方法来启动线程。Java中的多线程可以提高程序的并发性和执行效率。
|
Linux 调度 C++
|
存储 缓存 算法
多线程2
多线程2https://www.nowcoder.com/issue/tutorial?tutorialId=94&uuid=b40a485f92ff496b9fe332079fa5be66
69 0
|
存储 安全 Java
多线程1
多线程1-https://www.nowcoder.com/issue/tutorial?tutorialId=94&uuid=4e79fb9392af4f90b898311e8c1efe36
65 0
|
Java Linux 调度
多线程必知必记的
《基础系列》
141 0
多线程必知必记的