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
分享到:
相关推荐
以下是一个简单的多线程文件查找示例: ```csharp using System; using System.Collections.Generic; using System.IO; using System.Threading; public class MultiThreadedFileSearch { private static List...
为了实现文件的并行传输,可以为每个部分创建一个线程,每个线程负责传输文件的一个部分。这可以通过分割文件到多个块,然后将这些块分配给不同线程来实现。线程间通信可以通过共享内存、互斥锁、条件变量等同步原语...
然后,在`file_lock.py`的2.1部分,展示了没有使用任何同步机制(即不加锁)的多线程读写文件。这会导致并发问题,如输出所示,数据被错误地读取和写入,因为多个线程可能同时访问文件,导致数据混乱。 为了修复这...
线程间可能需要同步机制,如`Lock`,确保同一时刻只有一个线程写入文件,防止数据冲突。 3. **进度记录**:使用`pickle`或`json`模块存储下载进度,如已下载的字节数、当前线程等信息,方便断点续传。 4. **续传...
下面我们将详细探讨这个“一个简单的文件操作多线程程序类”的相关知识点。 1. **线程与并发** - **线程**:线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程同时执行。使用多线程可以实现任务并行...
总的来说,“文件打印问题”的多线程实现是理解和掌握C++并发编程的一个好例子。它涉及到线程同步、互斥访问和资源管理,这些都是现代软件开发中的核心技能。通过学习和实践,开发者能够编写出更高效、更可靠的并发...
多线程写入日志的另一个策略是使用条件变量(`std::condition_variable`),当多个线程试图写入时,它们可以等待一个信号来获取写入权限。这种方式可以提高效率,因为线程可以在等待写入时挂起,而其他线程有机会...
总之,通过Java的多线程技术,我们可以构建一个高效的文件下载系统,利用多核处理器的优势,加快下载速度。在这个案例中,不仅学习了Java多线程编程,还涉及到网络I/O、文件操作以及并发控制等多个知识点。
本项目“C#实现的多线程文件搜索”是利用C#强大的特性和库来实现一个高效的文件搜索机制,它能针对指定的目录及其子目录,快速查找包含特定关键字的HTML或文本文件,并返回匹配文件的名称。这个功能对于大数据量的...
在`cpp11logger-master`这个压缩包中,很可能是包含了一个使用C++11实现的日志库,它可能已经实现了上述的一些功能,如线程安全、日志级别控制等。你可以通过阅读源代码、编译和运行示例程序,来更深入地理解并学习...
在C#编程中,线程安全是多线程应用程序中至关重要的一个方面,尤其是在处理共享资源如文本日志文件时。本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,...
1. **同步机制**:由于多个线程可能同时访问同一个资源,比如写入同一个文件,因此需要使用锁(`threading.Lock`)或其他同步机制来确保数据一致性。 2. **异常处理**:每个线程可能独立抛出异常,我们需要为每个...
标题中的“随手做一个多线程的 CS架构的 文件传输Demo”指的是创建一个基于客户端-服务器(Client-Server,CS)架构的多线程文件传输示例。在这个项目中,我们将探讨如何利用多线程技术来提高文件传输的效率,以及在...
Java 多线程下载网站是一种技术,用于提高从互联网上获取大文件或整个网站内容的效率。这种技术利用了Java的并发特性,通过创建多个线程来并行下载不同的部分,从而缩短整体下载时间。本项目是基于Java实现的一个整...
总的来说,这个Java实验涵盖了从基本的文件操作到复杂的多线程和网络编程,对于Java初学者来说是一份宝贵的资源。通过这些实验,学习者不仅可以掌握Java编程的基本技能,还能了解到如何在实际项目中应用这些知识。
总结起来,这个C#示例展示了如何通过使用`lock`关键字和适当的文件流选项,在多线程环境中安全地向同一文件写入数据。这种技术在处理并发任务时非常有用,特别是在日志记录、数据聚合或其他需要多线程写入的场景。
`writeOpenPortsToFile`方法使用同步锁来确保只有一个线程能同时写入文件。`Main`类创建了一个固定大小的线程池,将端口范围分成多个部分,并启动线程进行扫描。 通过这种方式,我们可以高效地完成大量端口的扫描...
本教程将详细讲解如何使用HttpURLConnection实现单线程、多线程下载以及多线程续点下载。 **一、单线程下载** 单线程下载是最基础的下载方式,它通过一个连接获取服务器资源并写入本地文件。以下是一个简单的单...
在IT领域,尤其是在编程实践中,"C# 多线程网页信息抓取"是一个重要的主题。这个主题涉及到网络编程、多线程技术和信息提取技术,是构建高效爬虫程序的关键。下面将详细解释这些知识点: 1. **C#语言基础**:C#是一...
总结起来,本文介绍了如何在Qt中使用线程锁(如`QMutex`)来保护多线程访问资源,如何通过文件锁(如`QFileDevice::lock()`)实现跨进程的文件同步,以及如何用生产者-消费者模型(如`QWaitCondition`和`QSemaphore`...