日期:2014-05-20  浏览次数:20655 次

java 多线程文件加锁,求帮助,急,在线等
前提我要写个线程,对多个文件进行写操作。
当有触发某个东西的时候,我就要启动一次这个线程进行写操作。
问题来了,就是前面的还没写完,后面又启动了一个线程进行写操作,这样就不行。(刚好同时对一个文件进行操作)
现在我想要对这个文件加锁,当前面有线程在对这个文件写操作时,就让后面要操作的线程等待,等前面的写完了,我就让后面等待的去操作。
有哪位大神告诉我该怎么实现,光是加把锁不可靠呀,后面的线程就不会等待对此继续操作了,有哪位大神能告诉我该怎么加锁怎么写么?
 //对该文件加锁(这是我在网上找的,不行)
   FileOutputStream out=new FileOutputStream(file,true);
   FileChannel fcout=out.getChannel();
   FileLock flout=null;
         while(true){
                flout=fcout.tryLock();
                if(flout!=null){
                    break;
                }
                else{
                    System.out.println("有其他线程正在操作该文件,当前线程休眠1000毫秒");
                    sleep(100);
                }
            }
java 多线程 file 加锁

------解决方案--------------------
用LinkedList来装你所有的文件操作线程,然后你开启一个公共的线程,一个一个的处理LinkedList里面的线程,这就有点想线程池,处理完就关闭,不需要对文件上锁  多麻烦嘛
------解决方案--------------------
(1)首先加锁是可以的,你应该调用lock方法,而不是tryLock,因为tryLock尝试获取锁,不过得不到不会等待,就进行下面的操作,lock会一直等待资源,知道资源可用。还有就是你只是代码中只是启用了锁,但是没有释放的代码
(2)为什么要启用那么多线程呢?你如果每次都写到的是同一个文件里面,采用一个LinkedBlockingQueue,需要生成的数据每次添加到队列里面,由一个线程负责写,每次从队列中取一个数据,这个QUEUE本身就是线程安全的
------解决方案--------------------
public class Test implements Runnable{
public static int byteArrayToInt(byte[] b) {
       int value= 0;
       for (int i = 0; i < b.length; i++) {
           int shift= (b.length - 1 - i) * 8;
           value +=(b[i ] & 0x000000FF) << shift;
       }
       return value;
 }

static LinkedList<Runnable> runnables = new LinkedList<Runnable>() ;
public static void main(String[] args){
for (int i = 0; i < 10; i++) {
TestFileOutput fileOutput = new TestFileOutput() ;
runnables.add(fileOutput) ;
}
new Thread(new Test()).start() ;
}
public static void add(TestFileOutput fileOutput){
runnables.add(fileOutput) ;
}

@Override
public void run() {
while(runnables.size()> 0){
runnables.removeFirst().run() ;
}

}