`
lengyingxin
  • 浏览: 57977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程使用LockFIle,每个线程Lock一部分文件

 
阅读更多
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class LockFiles {

    static final int   LENGTH = 1000000;
    static FileChannel fc ;

    public static void main(String[] args) throws Exception {

        File file = new File("D://in.txt");
        FileOutputStream fo = new FileOutputStream(file);//可使用OutputStream和RandomAccessFile,使用InputStream会抛出异常NonWritableChannelException 

        fc  = fo.getChannel();
        ByteBuffer out = ByteBuffer.allocate(LENGTH);

        for (int i = 0; i < LENGTH; i++)

            out.put((byte)( 'i'+i));

        new LockAndModify(out, 0, 0 + LENGTH / 4);

        new LockAndModify(out, LENGTH / 3, LENGTH / 3 + LENGTH / 4);

    }

 

    private static class LockAndModify extends Thread {

        private ByteBuffer buff;

        private int        start, end;

 

        LockAndModify(ByteBuffer mbb, int start, int end) {

            this.start = start;

            this.end = end;

            mbb.limit(end);

            mbb.position(start);

            buff = mbb.slice();

            start();

        }

        
        public void run() {

            try {
                FileLock fl = fc.lock(start, end, false);

                System.out.println("The Buffer Locked: " + start + " to " + end);


                while (buff.position() < buff.limit() - 1){
                   	buff.put((byte) (buff.get() + 1));
                   	}
                fl.release();

                System.out.println("The Buffer Released: " + start + " to " + end);

            } catch (IOException e) {

                throw new RuntimeException(e);

            }

        }

    }

}


运行结果如下:The Buffer Locked: 333333 to 583333
The Buffer Locked: 0 to 250000
The Buffer Released: 333333 to 583333
The Buffer Released: 0 to 250000
如果两个线程的锁定重叠就会抛出如下异常:Exception in thread "Thread-1" java.nio.channels.OverlappingFileLockException
0
0
分享到:
评论
1 楼 hejianmingwshjmcj 2012-09-07  
不知道应用到什么场景

相关推荐

    C# 多线程查找文件

    以下是一个简单的多线程文件查找示例: ```csharp using System; using System.Collections.Generic; using System.IO; using System.Threading; public class MultiThreadedFileSearch { private static List...

    C语言实现 多线程文件传输

    为了实现文件的并行传输,可以为每个部分创建一个线程,每个线程负责传输文件的一个部分。这可以通过分割文件到多个块,然后将这些块分配给不同线程来实现。线程间通信可以通过共享内存、互斥锁、条件变量等同步原语...

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

    然后,在`file_lock.py`的2.1部分,展示了没有使用任何同步机制(即不加锁)的多线程读写文件。这会导致并发问题,如输出所示,数据被错误地读取和写入,因为多个线程可能同时访问文件,导致数据混乱。 为了修复这...

    Python-HTTP大文件多线程下载工具支持断点续传

    线程间可能需要同步机制,如`Lock`,确保同一时刻只有一个线程写入文件,防止数据冲突。 3. **进度记录**:使用`pickle`或`json`模块存储下载进度,如已下载的字节数、当前线程等信息,方便断点续传。 4. **续传...

    一个简单的文件操作多线程程序类(自己用的)

    下面我们将详细探讨这个“一个简单的文件操作多线程程序类”的相关知识点。 1. **线程与并发** - **线程**:线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程同时执行。使用多线程可以实现任务并行...

    文件打印问题 (c++多线程实现)

    总的来说,“文件打印问题”的多线程实现是理解和掌握C++并发编程的一个好例子。它涉及到线程同步、互斥访问和资源管理,这些都是现代软件开发中的核心技能。通过学习和实践,开发者能够编写出更高效、更可靠的并发...

    LOG文件c++实现,多线程写入

    多线程写入日志的另一个策略是使用条件变量(`std::condition_variable`),当多个线程试图写入时,它们可以等待一个信号来获取写入权限。这种方式可以提高效率,因为线程可以在等待写入时挂起,而其他线程有机会...

    Java实现文件的多线程下载

    总之,通过Java的多线程技术,我们可以构建一个高效的文件下载系统,利用多核处理器的优势,加快下载速度。在这个案例中,不仅学习了Java多线程编程,还涉及到网络I/O、文件操作以及并发控制等多个知识点。

    C#实现的多线程文件搜索

    本项目“C#实现的多线程文件搜索”是利用C#强大的特性和库来实现一个高效的文件搜索机制,它能针对指定的目录及其子目录,快速查找包含特定关键字的HTML或文本文件,并返回匹配文件的名称。这个功能对于大数据量的...

    C++ 并发多线程日志处理

    在`cpp11logger-master`这个压缩包中,很可能是包含了一个使用C++11实现的日志库,它可能已经实现了上述的一些功能,如线程安全、日志级别控制等。你可以通过阅读源代码、编译和运行示例程序,来更深入地理解并学习...

    C# 高效线程安全,解决多线程写txt日志类

    在C#编程中,线程安全是多线程应用程序中至关重要的一个方面,尤其是在处理共享资源如文本日志文件时。本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,...

    Python多线程下载管理

    1. **同步机制**:由于多个线程可能同时访问同一个资源,比如写入同一个文件,因此需要使用锁(`threading.Lock`)或其他同步机制来确保数据一致性。 2. **异常处理**:每个线程可能独立抛出异常,我们需要为每个...

    随手做一个多线程的 CS架构的 文件传输Demo

    标题中的“随手做一个多线程的 CS架构的 文件传输Demo”指的是创建一个基于客户端-服务器(Client-Server,CS)架构的多线程文件传输示例。在这个项目中,我们将探讨如何利用多线程技术来提高文件传输的效率,以及在...

    Java 多线程下载网站

    Java 多线程下载网站是一种技术,用于提高从互联网上获取大文件或整个网站内容的效率。这种技术利用了Java的并发特性,通过创建多个线程来并行下载不同的部分,从而缩短整体下载时间。本项目是基于Java实现的一个整...

    java实验(包含文件、多线程等)

    总的来说,这个Java实验涵盖了从基本的文件操作到复杂的多线程和网络编程,对于Java初学者来说是一份宝贵的资源。通过这些实验,学习者不仅可以掌握Java编程的基本技能,还能了解到如何在实际项目中应用这些知识。

    C#实现多线程写入同一个文件的方法

    总结起来,这个C#示例展示了如何通过使用`lock`关键字和适当的文件流选项,在多线程环境中安全地向同一文件写入数据。这种技术在处理并发任务时非常有用,特别是在日志记录、数据聚合或其他需要多线程写入的场景。

    java多线程实现-tcp端口扫描

    `writeOpenPortsToFile`方法使用同步锁来确保只有一个线程能同时写入文件。`Main`类创建了一个固定大小的线程池,将端口范围分成多个部分,并启动线程进行扫描。 通过这种方式,我们可以高效地完成大量端口的扫描...

    HttpURLConnection实现单线程下载,多线程下载,多线程续点下载

    本教程将详细讲解如何使用HttpURLConnection实现单线程、多线程下载以及多线程续点下载。 **一、单线程下载** 单线程下载是最基础的下载方式,它通过一个连接获取服务器资源并写入本地文件。以下是一个简单的单...

    c# 多线程网页信息抓取

    在IT领域,尤其是在编程实践中,"C# 多线程网页信息抓取"是一个重要的主题。这个主题涉及到网络编程、多线程技术和信息提取技术,是构建高效爬虫程序的关键。下面将详细解释这些知识点: 1. **C#语言基础**:C#是一...

    Qt加锁操作、文件锁、生产消费锁GUI演示

    总结起来,本文介绍了如何在Qt中使用线程锁(如`QMutex`)来保护多线程访问资源,如何通过文件锁(如`QFileDevice::lock()`)实现跨进程的文件同步,以及如何用生产者-消费者模型(如`QWaitCondition`和`QSemaphore`...

Global site tag (gtag.js) - Google Analytics