前提我要写个线程,对多个文件进行写操作。
当有触发某个东西的时候,我就要启动一次这个线程进行写操作。
问题来了,就是前面的还没写完,后面又启动了一个线程进行写操作,这样就不行。(刚好同时对一个文件进行操作)
现在我想要对这个文件加锁,当前面有线程在对这个文件写操作时,就让后面要操作的线程等待,等前面的写完了,我就让后面等待的去操作。
有哪位大神告诉我该怎么实现,光是加把锁不可靠呀,后面的线程就不会等待对此继续操作了,有哪位大神能告诉我该怎么加锁怎么写么?
 //对该文件加锁(这是我在网上找的,不行)
   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加锁

解决方案 »

  1.   

    用LinkedList来装你所有的文件操作线程,然后你开启一个公共的线程,一个一个的处理LinkedList里面的线程,这就有点想线程池,处理完就关闭,不需要对文件上锁  多麻烦嘛
      

  2.   

    (1)首先加锁是可以的,你应该调用lock方法,而不是tryLock,因为tryLock尝试获取锁,不过得不到不会等待,就进行下面的操作,lock会一直等待资源,知道资源可用。还有就是你只是代码中只是启用了锁,但是没有释放的代码
    (2)为什么要启用那么多线程呢?你如果每次都写到的是同一个文件里面,采用一个LinkedBlockingQueue,需要生成的数据每次添加到队列里面,由一个线程负责写,每次从队列中取一个数据,这个QUEUE本身就是线程安全的
      

  3.   

    http://hi.baidu.com/mystronger/item/b701c1ee997a14a9ce2d4f2e
    这位博主的实现目标和我的差不多,但是我用博主的代码运行,它是能阻止后面的线程进行操作,但是前面的线程执行完了,后面那个被阻止的线程就不会继续执行了,而且会报一个错误,谁能帮我解决下,~~!!!
      

  4.   

    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() ;
    }

    }
    }
    /*
     * 我文件操作线程
     */
    class TestFileOutput implements Runnable{ @Override
    public void run() {
    System.out.println("进入线程操作");
    try {
    //睡眠一秒,模拟线程操作文件
    Thread.sleep(1000) ;
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("完成线程操作");
    }

    }
      

  5.   

    可以这样考虑,首先每个文件对应一个标识  , 标识这个文件是否在被线程处理,(比如:我用一个Map把所有不重复的文件装在一起,key为文件名, value为标识,有线程取文件时首先判断标识是否可取,取到改变标识, 操作完成就又改回来就可以), 不知道这样处理可以不,
      

  6.   

    我使用的是Java中的ReadWriteLock,你可以试试http://blog.csdn.net/sunnybuer/article/details/8263056