Java线程学习经典例子-读写者演示

简介: Java线程学习经典例子-读写者演示Java线程学习最经典的例子-读写者,主要用到Thread相关知识如下:-         线程的start与run-         线程的休眠(sleep)-         数据对象加锁(synchronized)-         数据对象的等待与释放(wait and notify)程序实现:-ObjectData数据类对象,通过synchronized关键字实现加锁,在线程读写者中使用。

Java线程学习经典例子-读写者演示

Java线程学习最经典的例子-读写者,主要用到Thread相关知识如下:

-         线程的start与run

-         线程的休眠(sleep)

-         数据对象加锁(synchronized)

-         数据对象的等待与释放(wait and notify)

程序实现:

-ObjectData数据类对象,通过synchronized关键字实现加锁,在线程读写者中使用。

-ConsumerThread消费者线程,读取数据对象中count值之后,通知生产者线程

-ProductThread生产者线程,对数据对象中count值操作,每次加1,然后通知消费者线程

类结构图如下:


代码实现

消费者-读线程

package com.gloomyfish.jse.thirdteen;

public class ConsumerThread extends Thread {
	private ObjectData data;
	public ConsumerThread(ObjectData data) {
		this.data = data;
	}

	@Override
	public void run() {
		while(true) {
			try {
				synchronized (data) {
					data.wait();
					data.read();
					data.notify();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
写线程-生产者线程

package com.gloomyfish.jse.thirdteen;

public class ProductThread extends Thread {
	private ObjectData data;

	public ProductThread(ObjectData data) {
		this.data = data;
	}

	@Override
	public void run() {
		while (true) {
			try {
				synchronized (data) {
					data.write();
					Thread.sleep(3000);
					data.notify();
					data.wait();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
数据对象类

package com.gloomyfish.jse.thirdteen;

public class ObjectData {

	private int count;
	
	public ObjectData() {
		count = 0;
	}
	
	public void read() {
		System.out.println("read count : " + count);
		System.out.println();
	}
	
	public void write() {
		count++;
		System.out.println("write count : " + count);
	}
}
测试代码:

	public static void main(String[] args) {
		ObjectData data = new ObjectData();
		ConsumerThread ct = new ConsumerThread(data);
		ProductThread pt = new ProductThread(data);

		ct.start();
		pt.start();
}
总结:

示例程序代码完成了线程之间如何通过wait与notify实现数据的读写

同步控制。演示了Java的同步关键字synchronized的用法与线程的用法。






目录
相关文章
|
12月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
522 1
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
292 1
|
12月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
875 0
|
12月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
1038 8
|
12月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
609 1
|
12月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
541 1
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
203 5
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
299 5
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
361 3
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
200 1