Java开发——39.多线程_(线程通信)

简介: 线程通信A和B通电话,A需要打给B,B接听,A讲,B听;B讲,A听...

进程:系统分配资源的单位;

线程:处理器任务调度和执行的单位,线程之间共享进程资源。


线程通信:

解释:(A和B通电话,A需要打给B,B接听,A讲,B听;B讲,A听...)

我们在之前接触到的都是多个线程抢占CPU,谁抢到谁先执行,线程通信就是实现多个线程之间的通信,线程A执行,阻塞;线程B执行,阻塞,线程A执行,阻塞;线程B...

image.png


学习方法:



wait():线程阻塞,调用该方法的同时会释放同步监视器(锁)
notify():唤醒被wait的线程,但是只唤醒一个线程(优先唤醒优先级高的线程)
notifyAll():唤醒所有被wait的线程。
注意:wait()、notify()以及notifyAll()方法都是声明在Object类中的只能在同步代码块/同步方法中使用,必须保证和同步监视器的对象相同。


面试题:wait()和sleep()的区别?

  1. 声明位置不同:
  1. wait()声明在Object类中
  2. sleep()声明在Thread类中
  1. 作用范围不同:
  1. wait()只能声明在同步代码块/同步方法中
  2. sleep()声明位置比较随意
  1. 释放同步监视器:
  1. wait()在方法阻塞后会自动释放同步监视器
  2. sleep()在方法阻塞后不会自动释放同步监视器


自动释放锁的操作:

1.当前线程的同步方法、同步代码块执行结束;Lock锁,需要手动调用unlock()才能释锁;

2.当前线程在同步代码块、同步方法中遇到break、return终止了该代码块/ 该方法的继续执行;

3.当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束;

4.当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线 程暂停,并释放锁。


不会自动释放锁的操作:

1.线程执行同步代码块或同步方法时,程序调用Thread.sleep()、 Thread.yield()方法暂停当前线程的执行,并不会释放锁;

2.线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器);

3.应尽量避免使用suspend()和resume()来控制线程。

(suspend()和resume()是一对方法,挂起和开始。)


方法演示:


/*** 线程1和线程2交替输出100个数字*/publicclassDemo {
publicstaticvoidmain(String[] args) {
Numbernumber=newNumber();
Threadthread01=newThread(number);        
Threadthread02=newThread(number);
thread01.setName("线程01");        
thread02.setName("线程02");
thread01.start();        
thread02.start();
    }
}
classNumberimplementsRunnable{
privateintnum=1;    
Objectobj=newObject();
@Overridepublicvoidrun() {
while (true) {            
synchronized (obj) {
//synchronized (this) {//如果此处的锁为this则下面执行的线程唤醒都应该为this.notify()/this.wait()或者省略this                obj.notify();
if (num<=100) { System.out.println(Thread.currentThread().getName() +":"+num);             num++;
try {                        
obj.wait();                    
                     } catch (InterruptedExceptione) {        e.printStackTrace();                    }
                }else {                   
break;                
                }
            }       
        }
    }}


相关文章
|
1天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
32 20
|
4天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
7天前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
23天前
|
前端开发 Java 程序员
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
42 6
|
26天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
38 5
|
26天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
28 4
|
26天前
|
SQL Java API
|
26天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
48 2
|
2月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
2月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1288 1
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)