[java][高级]Java线程间通信

2024-09-05 02:44
文章标签 java 线程 间通信 高级

本文主要是介绍[java][高级]Java线程间通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
线程间的通信
多个线程在处理同一个资源,但是任务却不相同
*/class Resource {private String name;private String sex;private boolean flag = false;public synchronized void set(String name, String sex) {if (flag) try {this.wait();} catch (InterruptedException e) {}this.name = name;this.sex = sex;flag = true;this.notify();}public synchronized void out() {if (!flag) try {this.wait();} catch (InterruptedException e) {}System.out.println(name + "````````" + sex);flag = false;this.notify();}
}class Input implements Runnable {Object obj = new Object();Resource r;Input(Resource r) {this.r = r;}public void run() {int x = 0;while (true) {if (x == 0) {r.set("mike", "nan");} else {r.set("丽丽", "女女女女");}x = (x + 1) % 2;}}
}class Output implements Runnable {Resource r;Output(Resource r) {this.r = r;}public void run() {while (true) {r.out();}}
}class ResourceDemo {public static void main(String[] args) {Resource r = new Resource();Input in = new Input(r);Output out = new Output(r);Thread t1 = new Thread(in);Thread t2 = new Thread(out);t1.start();t2.start();}
}

        这段代码是一个简单的Java程序,它演示了线程间的通信。程序中定义了一个名为Resource的类,它包含了一些私有成员变量和一个同步方法set以及一个同步方法outset方法用于设置资源的名称和性别,而out方法用于输出资源的信息。

        Input类实现了Runnable接口,它代表一个输入线程,负责设置资源的值。Output类也实现了Runnable接口,它代表一个输出线程,负责打印资源的信息。

        在ResourceDemo类的main方法中,创建了Resource对象和两个线程对象t1t2t1线程用于执行Input类的run方法,而t2线程用于执行Output类的run方法。这两个线程分别代表不同的任务,它们通过Resource对象进行通信。

        程序的关键点在于waitnotify方法的使用。当set方法被调用时,如果flagtrue,表示资源已经被占用,那么调用wait方法会使当前线程等待,直到其他线程调用notify方法。当out方法被调用时,如果flagfalse,表示资源未被占用,那么调用wait方法也会使当前线程等待,直到其他线程调用notify方法。

   flag变量用于标记资源是否被占用。当资源被设置后,flag被设置为true,并且调用notify方法唤醒等待的线程。当资源被输出后,flag被设置为false,并且调用notify方法唤醒等待的线程。

        这个程序的目的是演示线程同步和通信的基本机制,但它在实际应用中可能存在一些问题,比如死锁和资源竞争。在实际开发中,需要根据具体情况设计更健壮的线程同步机制。

这篇关于[java][高级]Java线程间通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137751

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直