首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

多线程操作同一资料

2012-11-17 
多线程操作同一文件[aligncenter][/align]多线程记录文件问题多个用户同时对一个文件进行写操作 会存在并

多线程操作同一文件
[align=center][/align]

多线程记录文件问题多个用户同时对一个文件进行写操作 会存在并发 所以实用连接队列依次处理  保证不会出现并发操作首先定义一个对象 存放需要写入文件的记录public class WriteRecord定义一个线程  持续写入文件public class RecordManager implements Runnable{private ArrayList cdrlist=new ArrayList();//存放需要写入记录的队列private static RecordManager manager=new RecordManager();//单例模式 保证不会出现多个实例 否则写文件会有并发private static BufferedOutputStream out=null;//写入文件流句柄private Object syncobj=new Object();//同步对象private boolean istrue=true;//线程停止对象  当false时线程停止  最好不要强制停止线程 设置个标志变量为好/***静态代码块 只有在类被实例化的时候调用一次(无论实例化多少次都是)static{out=new BufferedOutputStream(new FileOutputStream(path,true));//true表示在文本最后追加记录}private RecordManager()//单例模式 默认构造方法必须为私有{}public static RecordManager getInstrance()//提供获取实例的单例方法{return manager;}/***将要写的记录加入队列中*/private void writeCDR(WriteRecord record){    //同步操作synchronized(cdrlist){cdrlist.add(record);}synchronized(syncobj){syncobj.notifyAll();//有需要写入的记录后 唤醒正在休眠的线程 立即开始工作}}/***写文件*/private void Write(WriteRecord record){out.wirte(reocord.toString()+"\r\n".getBytes());}public void run(){while(istrue){while(cdrlist.size()>0){synchronized(cdrlist){WriteRecord record=(WriteRecord)cdrlist.remove(0);write(record);}}synchronized(syncobj){synchronized(cdrlist){if(cdrlist.size()==0){    try    {syncobj.wait(1000)}catch(InterruptedException E){}}}}}}}

热点排行