一、sleep() 与 wait()

两者都会让当前线程进入等待状态。唤醒后都需要等待 CPU 资源,不一定会立即执行。若在等待期间被调用此线程的的 interrupt() 方法,将会产生 InterruptedException 异常。

wait() 是 Object 类的方法,会释放对象锁,并让出 CPU 资源。只能在 synchronized 下使用,使用 notify() 或 notiftAll() 唤醒。

// 线程工厂,这里主要用来设置线程名字
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
// 创建线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(6, 6, 0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy()); Object object = new Object();
threadPool.execute(() -> {
try {
synchronized (object) {
object.wait();
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}); threadPool.execute(() -> {
synchronized (object) {
System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBBBB");
object.notify();
}
});

sleep() 是 Thread 类的静态方法,只会让出 CPU 资源。可以使低优先级的线程得到执行的机会。

// 线程工厂,这里主要用来设置线程名字
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
// 创建线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(6, 6, 0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy()); threadPool.execute(() -> {
try {
// 阻塞 1 秒
Thread.sleep(1000);
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAA");
} catch (InterruptedException e) {
e.printStackTrace();
}
}); threadPool.execute(() -> {
System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBBBBB");
});

两个示例都保证了 B 会在 A 之前被打印

二、notify() 与 notifyAll()

与 wait() 配合使用。两者都会唤醒其他线程,且会释放对象锁,不会阻塞当前线程。

其中 notify() 只唤醒等待线程当中的一个,notifyAll() 会唤醒所有等待线程。

唤醒的线程为同一个对象锁的线程。唤醒一个或所有,都只有一个线程会获取到锁对象。

三、yield() 与 join()

yield() 是 Thread 类的静态原生 (native) 方法,作用是让出 CPU 资源,不会阻塞当前线程,但可能让出 CPU 资源后,系统重新调度后又会选择给该线程 CPU 资源。使用场景比较少。

join() 是Thread 类实例的方法,可以使得一个线程在另一个线程结束后再执行。当前运行的线程将进入到等待状态直到另一个线程执行完成。

Thread t1 = new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("A");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}; Thread t2 = new Thread(){
@Override
public void run() {
try {
t1.join();
System.out.println("B");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}; t2.start();
t1.start();

示例中保证了 A 在 B 之前被打印

四、interrupt()

中断等待状态的线程,并抛出异常。相关方法有三个。

interrupt() 是 Thread 类实例的方法,给线程中断状态设置为 false,等线程进入到等待状态时就会被中断,并抛出异常

isInterrupted() 是 Thread 类实例的方法,检测线程的中断状态

interrupted() 是 Thread 类的静态方法,实质调用的是 currentThread().isInterrupted(true),作用是检测线程的中断状态,然后将状态设置为 true

Thread t1 = new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "启动后的中断状态:" + Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt();
System.out.println(Thread.currentThread().getName() + "interrupt()后的中断状态:" + Thread.currentThread().isInterrupted()); System.out.println(Thread.currentThread().getName() + "isInterrupted()获取中断状态:" + Thread.interrupted());
System.out.println(Thread.currentThread().getName() + "interrupted()后的中断状态:" + Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName() + "异常时中断状态:" + Thread.interrupted());
}
}
}; new Thread() {
@Override
public void run() {
System.out.println(t1.getName() + "未启动时的中断状态:" + t1.isInterrupted());
System.out.println("=======================================================");
t1.start();
try {
t1.join();
System.out.println("=======================================================");
System.out.println(t1.getName() + "执行完时的中断状态:" + t1.isInterrupted());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();


https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

Java-线程等待、唤醒与中断的更多相关文章

  1. java - 线程等待与唤醒

    Java多线程系列--“基础篇”05之 线程等待与唤醒 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. w ...

  2. java之等待唤醒机制(线程之间的通信)

    线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ...

  3. Java线程等待与唤醒

    class ThreadA extends Thread{ public ThreadA(String name) { super(name); } public void run() { synch ...

  4. java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

    Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...

  5. java线程阻塞唤醒的四种方式

    java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...

  6. 并发基础(九) java线程的终止与中断

    1.简单了解一下:为何不赞成使用 Thread.stop.Thread.suspend 和 Thread.resume?   suspend .resume.stop方法分别完成了线程的暂停.恢复.终 ...

  7. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  8. Java 多线程基础(六)线程等待与唤醒

    Java 多线程基础(六)线程等待与唤醒 遇到这样一个场景,当某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制. 一 ...

  9. java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

     *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...

  10. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

随机推荐

  1. scrapyd使用教程

    1. 安装服务器: pip install scrapyd 启动: scrapyd 访问:127.0.0.1:6800 2. 安装客户端 pip install scrapyd-client 3. 进 ...

  2. PHP高级进阶之路

    一:常见模式与框架 学习PHP技术体系,设计模式,流行的框架 常见的设计模式,编码必备 Laravel.ThinkPHP开发必不可少的最新框架 YII.Symfony4.1核心源码剖析 二:微服务架构 ...

  3. python之jupyter安装与使用

    Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown.用途包括:数据清理和转换,数值模拟,统计建模,机器学 ...

  4. ccs之经典布局(一)(水平垂直居中)

    经典的css布局有以下几种,下面分别用不同的方法进行实现且进行对比. 一.水平居中 水平居中布局指的是当前元素在父级元素的容器中,水平方向上显示的是居中的,有以下几种方式来完成布局: 1.margin ...

  5. 运维学习篇之jenkins的安装(CentOS7)

    一. 介绍   Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能二. 作用  1.持续的软件版本 ...

  6. 2019.10.28sql注入工具

    SQLMAP工具的使用 sql注入工具:明小子 啊D 萝卜头 穿山甲 sqlmap等等 开源自动化注入利用工具,支持12中数据库,在/plugins中可以看到支持的数据库种类 支持的注入类型:bool ...

  7. spring cloud eureka注册原理-注册失败填坑

    写在前面 我们知道Eureka分为两部分,Eureka Server和Eureka Client.Eureka Server充当注册中心的角色,Eureka Client相对于Eureka Serve ...

  8. pidstat 命令(Linux 进程使用资源情况采样)

    pidstat 作用 pidstat 获取服务器指定进程的使用资源信息(包括 CPU.设备IO.内存.线程.任务切换等). 执行一波 [root@wille ~]# pidstat Linux 2.6 ...

  9. python3之selenium.webdriver 库练习自动化谷歌浏览器打开百度自动百度关键字

    import os,time,threading from selenium import webdriver from selenium.webdriver.common.keys import K ...

  10. 红帽Linux故障定位技术详解与实例(1)

    红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...