`
sunxboy
  • 浏览: 2870373 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

怎样在不同线程间实现对文件的同步操作

阅读更多

采用了一个核心类:org.apache.commons.io.output.LockableFileWriter

该类在实例化的时候会在临时文件夹创建一个lock文件,close的时候删除该lock文件。
根据这个lock的存在与否来判断目标文件是否被锁定。

如果目标文件使用中,那么创建lock文件会抛出异常。

拿锁的代码

//如果文件被锁,那么就持续的尝试拿锁60秒
    LockableFileWriter writer = null;
    int step = 0;
    while(null == writer && step < 60){
     try {
      writer = new LockableFileWriter(file);
     } catch (IOException e) {
       try {
        this.wait(1000);
       } catch (InterruptedException e1) {
        logger.error(e1);
       }
       step++;
     }
    }
  
    if(null == writer){
     return;
    }

 

释放锁的代码

 

try {
     writer.close();
    } catch (IOException e) {
     logger.error(" 释放锁出错", e);
    }

 

如果不想打开文件,但是又想锁定文件,不让LockableFileWriter 用。那么只好直接操作那个lock文件了。

 

//拿锁

String destFile = xxxxx.txt;

File lockFile = null;
   boolean isLockCreated = false;
   int step = 0;
   while(isLockCreated == false && step < 60){
    String lock = System.getProperty("java.io.tmpdir") + "/" + destFile + ".lck";
    lockFile = new File(lock);
    try {
     isLockCreated = lockFile.createNewFile();
     if(!isLockCreated){
      try {
       this.wait(1000);
      } catch (InterruptedException e) {
       logger.error(e);
      }
     }
    } catch (IOException e) {
     try {
      this.wait(1000);
     } catch (InterruptedException e1) {
      logger.error(e1);
     }
    
     logger.error(e);
    }
   
   
    step++;
   }
  
   if(false == isLockCreated || null == lockFile){
    return;
   }

/*业务操作*/

//放锁
lockFile.deleteOnExit();

 

 

分享到:
评论

相关推荐

    JAVA实现线程间同步与互斥生产者消费者问题

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

    3种多线程实现同步方法

    本篇文章将深入探讨三种在C++中实现多线程同步的方法:事件对象、关键代码段和互斥对象。 首先,我们来看**事件对象**。事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...

    VC++6.0下利用互斥量同步线程来实现文件读取进度条C++源代码程序小实例

    在本文中,我们将深入探讨如何在VC++6.0环境下使用互斥量(Mutex)同步线程,以实现文件读取进度条的功能。这是一项在多线程编程中常见的任务,尤其是在开发用户界面丰富的应用程序时,为了提供更好的用户体验,我们...

    vc++中的线程锁(线程锁保持线程同步)

    `Thread.cpp`和`DerivedThread.cpp`可能包含了线程类的实现,这些类可能封装了线程的创建、运行以及线程间的同步操作。线程类通常包含一个运行函数,如`Run()`,在这个函数中执行线程的任务。而`TestLock.cpp`和`...

    VC基于多线程的同步聊天,与文件传输

    在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC)开发一个多线程的同步聊天及文件传输应用。这个项目结合了网络编程、多线程技术和文件操作,旨在实现客户端和服务端之间的实时通信和文件交换。 ...

    C#实现的文件同步软件

    在实现文件同步时,需要正确处理文件的读取、写入和移动操作。 2. **文件监控**:为了实现实时同步,可能使用了FileSystemWatcher类,它可以监听指定目录下的文件和目录变更事件,如创建、修改、删除和重命名。 3....

    python多线程同步之文件读写控制

    在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...

    多线程实现文件中字母数字及其他字符的分配

    在给定的“多线程实现文件中字母数字及其他字符的分配”项目中,我们看到一个旨在利用多线程来读取文件、分析字符并进行某种形式的分配的任务。下面我们将深入探讨这个主题,包括多线程的基本概念、Linux环境下的...

    易语言多线程读取大文本文件

    总的来说,"易语言多线程读取大文本文件"涉及到的知识点包括:易语言的线程编程、文件I/O操作、API函数的使用、字符编码转换以及线程同步与资源管理。通过熟练掌握这些知识点,开发者可以编写出高效、稳定的程序,...

    C++ 实现多线程文件传输的设计与实现

    总之,C++实现的多线程文件传输结合了多线程、网络通信和文件I/O等关键技术,通过合理的设计和优化,可以在保证数据完整性的前提下,大大提高文件传输效率。在实际开发中,需要不断调整和测试,以找到最佳的性能与...

    操作系统课程设计打包奉上【含DOS下多线程的实现,内存模拟文件系统】

    在OSTcb.txt这个文件中,很可能包含了多线程的实现代码,包括线程创建、同步、通信和销毁等关键操作。 接下来是文件系统。文件系统是操作系统中负责组织和管理磁盘上数据的组件。它定义了文件的命名规则、存储结构...

    c++实现多线程同步

    本文将深入探讨如何在C++中实现多线程以及如何利用信号量进行线程同步。 首先,我们需要理解什么是多线程。在单线程程序中,执行流是线性的,而多线程允许程序同时执行多个不同的任务。这通常会提高程序的响应性和...

    Android多线程文件上传

    2. Handler/Looper:创建一个后台线程,通过Handler和Looper与主线程通信,实现文件的分块上传。 3. ExecutorService:Java提供的线程池服务,可以创建固定数量的线程,适合处理并发上传任务,避免了频繁创建销毁...

    Delphi中用多线程实现日志文件的读写与管理

    本文将深入探讨如何在Delphi中利用多线程技术来实现日志文件的高效读写与管理。 首先,了解多线程的概念。在单线程环境下,所有的操作都是顺序执行的,如果在处理日志时阻塞了主线程,可能会导致用户界面的卡顿。而...

    Delphi多线程实现文件拷贝

    在这个类中,我们将实现文件拷贝的具体逻辑。 2. **重写Execute方法**:`Execute`方法是线程运行的主要入口点。在这里,我们需要编写文件拷贝的代码。通常包括打开源文件、创建目标文件、读取源文件数据并写入目标...

    多线程操作共享文件.zip

    本压缩包“多线程操作共享文件.zip”显然是一个关于如何在Delphi中实现多线程间互斥访问共享文件的示例项目。 标题“多线程操作共享文件.zip”直接揭示了主题,即通过多线程技术处理同一份文件,这在分布式系统、...

    用C#实现的多线程同步打印文章(windows操作系统实验)

    在本文中,我们将深入探讨如何使用C#编程语言在Windows操作系统环境下实现多线程同步打印文章的实验。这个实验的核心是创建两个独立的线程,一个用于文章的下载,另一个用于文章的打印,同时利用线程同步机制确保...

    用多线程实现串口读写数据以及文件的读写

    本教程聚焦于如何利用多线程实现串口(Serial Port)读写数据及文件的读写操作,这对于理解和开发高效通信系统至关重要。 首先,我们要理解什么是串口通信。串口通信是一种基于串行数据传输的通信方式,它通过一条...

Global site tag (gtag.js) - Google Analytics