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

java多线程设计模式之文件保存

阅读更多

Java实现多线程保存文件:两线程去保存文件,一个保存线程定时去保存文件,一个修改线程去修改文件,随机停贷后再去保存文件,如果其中一个线程已经保存过文件了,那么另一个线程来保存文件的时候就不需要保存了。
这里的保存摸拟为内容写人文件中。
类设计如下:
Data:数据类用于存储文件内容信息的类,提供修改文件内容和保存内容的方法。
SaveThread:保存线程类定时保存调用数据类的保存方法去保存文件。
ChangeThread:修改线程类不断调用数据类的修改方法修改文件,并保存。
Mian:执行入口。

实现如下:

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

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

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

	private final String fileName;//文件名
	private String content; //文件内容
	private boolean changed; //标志文件是否被修改
	
	public Data(String name, String content){
		this.fileName = name;
		this.content = content;
		this.changed = true;
	}
	
	/**
	 * 修改文件内容,并将修改标志值为true
	 * @param content
	 */
	public synchronized void change(String content){
		this.content = content;
		changed = true;
	}
	
	/**
	 * 保存文件数据,即将数据内容写入到文件中去保存,并将修改标志值为false
	 * @throws IOException
	 */
	public synchronized void save()throws IOException{
		if(!changed)return;
		doSave(); //执行保存
		changed = false;
	}
	
	/**
	 * 将文件内容写入文件中保存
	 * @throws IOException
	 */
	public void doSave() throws IOException{
		Writer writer = new FileWriter(fileName);
		writer.write(content);
		writer.close();
		System.out.println(Thread.currentThread().getName()+" doSave content="+content);
	}

	
	
}


SaveThread:保存数据线程类
package com.blak.thread;

import java.io.IOException;


/**
 * 保存线程定时保存文件数据
 * @author Administrator
 *
 */
public class SaveThread extends Thread{

	private Data data;
	
	public SaveThread(Data data){
		super("SaveThread");
		this.data = data;
	}
	
	/**
	 * 保存线程每隔一秒检查保存文件一次
	 */
	public void run(){
		while(true){
			try {
				data.save();
				Thread.sleep(1000);//休息1秒
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}
	
}

ChangeThread:修改数据线程类
package com.blak.thread;

import java.io.IOException;
import java.util.Random;

/**
 * 修改文件线程,修改将文件保存
 * @author Administrator
 *
 */
public class ChangeThread extends Thread{

	private Data data;
	private Random random = new Random();
	
	public ChangeThread(Data data){
		super("ChangeThread");
		this.data = data;
	}
	
	/**
	 * 修改文件
	 */
	public void run(){
		try {
			for (int i = 0; i < 10; i++) {
				data.change("content."+i);
				Thread.sleep(random.nextInt(1000));//摸拟线程去执行其他任务
				data.save();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
}


Main:main执行入口

package com.blak.thread;

public class Main {
	
	/**
	 * 指定文件,启动保存线程和修改线程
	 * @param args
	 */
	public static void main(String[] args) {
		Data data = new Data("d:/data.txt", "test");
		new SaveThread(data).start();
		new ChangeThread(data).start();
	}
	

}

执行结果为:

SaveThread doSave content=test
ChangeThread doSave content=content.0
SaveThread doSave content=content.1
ChangeThread doSave content=content.2
ChangeThread doSave content=content.3
SaveThread doSave content=content.4
ChangeThread doSave content=content.5
SaveThread doSave content=content.6
ChangeThread doSave content=content.7
SaveThread doSave content=content.8
SaveThread doSave content=content.9




分享到:
评论

相关推荐

    Java设计模式——多例模式实验

    实例的个数用配置文件InstanceLimit.cfg指定。例如,如果InstanceLimit.cfg的内容为2,则LimitInstanceClass最多可以同时存在2个对象。LimitInstanceClass的对象有一个整型成员变量id,保存对象的编号;有一个...

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包4

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包3

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包2

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象...

    Java实验设计-实现一个小型档案管理系统

    4. 客户端和服务器端基于Socket实现通信,服务器端需实现多线程功能,可同时处理、响应多个客户端的数据请求 5. 用户信息管理功能,普通用户登录后可对自己基本信息(姓名、性别、民族、出生日期、职务、密码等信息)...

    二十三种设计模式【PDF版】

    之道 》,其中很多观点我看了很受启发,以前我也将"设计模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软 件中地位,下面是我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象...

    JAVA 范例大全 光盘 资源

    实例133 碰撞的球(多线程) 382 实例134 钟表(多线程) 387 实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 ...

    Java学习笔记

    一、JAVA SE基础 1、开发语言基本包括:数据类型、循环控制语句、数组、方法 2、面向对象:最终是面向接口编程的,封装...JAVA提供多线程、提供动态下载程序代码的机制、安全性,它的操作以字节码(class)文件形式保存

    达内java培训目录

    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java范例开发大全源代码

     8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车...

    java范例开发大全

    8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...

    Java范例开发大全 (源程序)

     8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器...

Global site tag (gtag.js) - Google Analytics