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

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

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();
      }
    }
  }
 
}1.

数据对象类

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的用法与线程的用法。

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