多线程操作同一文件
[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){}}}}}}}