`
xmong
  • 浏览: 262710 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程设计模式之读写文件模式

阅读更多

Java实现多线程读写数据

实现需求如下:
当数据没有写线程修改数据时,可以多个读线程读取数据。
当数据有写线程修改数据时,读线程等待,其他写线程也等待,只能有一个写线程修改数据。
当数据没有读线程读数据时,可以有一个写线程修改数据。
当数据有读线程读数据时,写线程不能修改数据。

设计如下:

Data:数据类,用于读写数据的类
ReadWriteLock:读写锁类,实现读写锁控制
ReaderThread:读线程,负责读取数据
WriterThread:写线程,负责写数据
Main:main类

实现如下:

Data:数据类
package com.thread.readwriter;

/**
 * 数据类
 * @author Administrator
 *
 */
public class Data {

	//写入数据缓存区
	private char[] buffer = new char[10]; 
	//数据的读写锁
	private final ReadWriteLock lock = new ReadWriteLock();
	
	/**
	 * 读取数据
	 * @return
	 * @throws InterruptedException
	 */
	public char[] read() throws InterruptedException{
		lock.readLock();
		try {
			char[] buffer = doRead();
			System.out.println(Thread.currentThread().getName()+" read "+String.valueOf(buffer));
			return buffer;
		} finally {
			lock.readUnlock();
		}
	}
	
	/**
	 * 以字符为单位一次一次的读取缓冲区的数据
	 * @return
	 */
	public char[] doRead(){
		char[] newbuffer = new char[buffer.length];
		for (int i = 0; i < buffer.length; i++) {
			newbuffer[i] = buffer[i];
		}
		return buffer;
	}
	
	/**
	 * 写入缓冲区数据
	 * @param c
	 * @throws InterruptedException
	 */
	public void write(char c) throws InterruptedException{
		lock.writeLock();
		try {
			System.out.println(Thread.currentThread().getName()+" write "+c);
			doWrite(c);
		} finally {
			lock.writeUnlock();
		}
	}
	
	/**
	 * 以字符为单位一次一次地写入缓冲区
	 * @param c
	 */
	public void doWrite(char c){
		for (int i = 0; i < buffer.length; i++) {
			buffer[i] = c;
		}
	}
	
}


ReadWriteLock:读写锁类
package com.thread.readwriter;

/**
 * 读写锁类
 * @author Administrator
 *
 */
public class ReadWriteLock {

	
	private int readingNum = 0; //正在读数据的线程数
	private int writingNum = 0; //正在写数据的线程数
	
	private int waitingNum = 0; //正在等待写数据的线程数
	private boolean writerPriority = true; //写数据优先
	
	/**
	 * 读数据上锁
	 * @throws InterruptedException
	 */
	public synchronized void readLock() throws InterruptedException{
		while(writingNum > 0 || (waitingNum > 0 && writerPriority)){
			wait();
		}
		readingNum++;
	}
	
	/**
	 * 读数据解锁
	 */
	public synchronized void readUnlock(){
		readingNum--;
		writerPriority = true;
		notifyAll();
	}
	
	/**
	 * 写数据上锁
	 * @throws InterruptedException
	 */
	public synchronized void writeLock() throws InterruptedException{
		waitingNum++;
		while(readingNum > 0 || writingNum >0 ){
			try {
				wait();
			} finally {
				waitingNum--;
			}
		}
		writingNum++;
	}
	
	/**
	 * 写数据解锁 
	 */
	public synchronized void writeUnlock(){
		writingNum--;
		writerPriority = false;
		notifyAll();
	}
	
}


ReaderThread:读线程类
package com.thread.readwriter;

import java.util.Random;

public class ReaderThread extends Thread{
	
	//数据
	private final Data data;
	//随机数
	private final Random random = new Random();
	
	/**
	 * 读线程构造方法
	 * @param name 线程名称
	 * @param data 注入需要读的数据
	 */
	public ReaderThread(String name, Data data){
		super(name);
		this.data = data;
	}
	
	/**
	 * 读取数据
	 */
	public void run(){
		while(true){
			try {
				data.read();
				Thread.sleep(random.nextInt(500));//随机休息
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

WriterThread:写线程类
package com.thread.readwriter;

/**
 * 写入线程类
 * @author Administrator
 *
 */
public class WriterThread extends Thread{

	//数据
	private final Data data;
	//写入字符串
	private final String str;
	//写字符串下标
	private int index = 0;
	
	/**
	 * 写入线程构造方法
	 * @param name 线程名称
	 * @param data 数据存储区
	 * @param str 写入字符串
	 */
	public WriterThread(String name, Data data, String str){
		super(name);
		this.data = data;
		this.str = str;
	}
	
	/**
	 * 写入字符串
	 */
	public void run(){
		while(true){
			try {
				char c = nextChar();
				data.write(c);
				Thread.sleep(3000); //随机休息
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 循环从字符串中获取字符
	 * @return
	 */
	private char nextChar(){
		char c = str.charAt(index);
		index++;
		if(index >= str.length()){
			index = 0;
		}
		return c;
	}
}

Main:main类

package com.thread.readwriter;

/**
 * main类
 * @author Administrator
 *
 */
public class Main {

	
	public static void main(String[] args) {
		//数据区
		Data data = new Data();
		//启动写线程
		new WriterThread("WriterThread.1", data, "abcdefghijklmnopkrstuvwxyz").start();
		new WriterThread("WriterThread.2", data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ").start();
		//启动读线程
		new ReaderThread("ReaderThread.1", data).start();
		new ReaderThread("ReaderThread.2",data).start();
		new ReaderThread("ReaderThread.3",data).start();
		new ReaderThread("ReaderThread.4",data).start();
	}
}

执行结果:

WriterThread.1 write a
WriterThread.2 write A
ReaderThread.2 read AAAAAAAAAA
WriterThread.2 write B
ReaderThread.2 read BBBBBBBBBB
WriterThread.1 write b
ReaderThread.4 read bbbbbbbbbb
WriterThread.2 write C
ReaderThread.4 read CCCCCCCCCC
ReaderThread.2 read CCCCCCCCCC
WriterThread.1 write c
ReaderThread.3 read cccccccccc
WriterThread.2 write D
ReaderThread.2 read DDDDDDDDDD
WriterThread.1 write d
ReaderThread.1 read dddddddddd
WriterThread.2 write E
ReaderThread.1 read EEEEEEEEEE
WriterThread.1 write e
ReaderThread.4 read eeeeeeeeee
WriterThread.1 write f
WriterThread.2 write F
ReaderThread.1 read FFFFFFFFFF
ReaderThread.4 read FFFFFFFFFF
。。




分享到:
评论

相关推荐

    JAVA多线程设计模式.pdf 下载

    标题和描述均指向了一个关于Java多线程设计模式的PDF文档的下载链接,这暗示了文档的主要内容将围绕Java中的多线程编程及其设计模式展开。在Java领域,多线程是一个核心概念,它允许程序执行多个任务同时进行,极大...

    java多线程设计模式详解(PDF及源码).zip

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何高效、安全地利用系统资源进行并发处理。在这个主题中,我们将深入探讨单线程、生产者与消费者模型以及Java中实现多线程的各种方法。 首先,单线程是程序...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

    java多线程设计模式详解

    Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境下高效、安全地组织代码...阅读提供的"java多线程设计模式详解.pdf"和"Java多线程设计模式源码"文件,将能更深入地理解这些模式的实际运用。

    java多线程设计模式详解(PDF及源码)

    《Java多线程设计模式详解》是一本深入探讨Java并发编程和设计模式的专业书籍,它涵盖了多线程环境下的各种核心概念、最佳实践以及常见问题的解决方案。这本书旨在帮助开发者在实际开发过程中更好地理解和应用多线程...

    java多线程设计模式源码

    Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...

    Java多线程设计模式上传文件

    本资源“Java多线程设计模式上传文件”很可能包含有关如何在Java环境中利用多线程进行文件上传的详细教程。下面我们将深入探讨Java多线程设计模式及其在文件上传中的应用。 1. **线程的基本概念**:在Java中,线程...

    java多线程设计模式

    ### Java多线程设计模式详解 #### 一、Java多线程基础 Java语言自诞生以来,便内置了对多线程的支持。多线程可以让应用程序在同一时间处理多个任务,提高程序的执行效率和响应速度。Java中创建线程有两种基本方式...

    JAVA设计模式与JAVA多线程设计模式详解

    在Java编程领域,设计模式和多线程设计模式是开发者必备的技能。设计模式是一种在特定情境下解决软件设计问题的通用、可复用的解决方案,而多线程设计模式则是处理并发问题的关键。本文将深入探讨这两种重要的概念,...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    Java多线程设计模式源代码

    本文将深入探讨Java多线程设计模式及其源代码,旨在帮助开发者理解和应用这些模式,提升代码的并发性能和可维护性。 1. **生产者消费者模式**:该模式基于`BlockingQueue`,例如`ArrayBlockingQueue`,用于在生产...

    java 多线程设计模式

    Java多线程设计模式是Java并发编程中的一种高级技巧,它可以帮助开发者在处理并发问题时,提高代码的可读性、可维护性和性能。多线程设计模式是基于Java的并发API,如Thread、Runnable、ExecutorService等,通过特定...

Global site tag (gtag.js) - Google Analytics