`

多线程同步写入,单线程读出

阅读更多
把项目中一个大文件对比进行了简单了模拟,多线程将大文件下的多个文件分割,lock控制差异同步写入到一个list中;当所有线程执行完毕,read 所有内容。



package cn.com.ld.study.thread;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @filename: LockTest
 * @description: TODO
 * @author java 小生
 * @date 2013-2-18 下午6:07:34
 */
public class LockTest {
	Lock rlock = new ReentrantReadWriteLock().writeLock();
	Lock lock = new ReentrantLock();// 锁
	private Collection<String> strc = new ArrayList<String>();
	private int readSequence;
	private int writeTimes = 0;

	LockTest(int writeTimes) {
		this.writeTimes = writeTimes;
	}

	public boolean write(String name) {
		try {
			lock.lock();
			readSequence++;
			System.out.println(name + " 被" + readSequence + "次写入");
			strc.add(name + readSequence);
		} finally {
			lock.unlock();
		}
		return writeTimes == readSequence ? true : false;

	}

	public void read() {
		System.out.println("读取写入内容开始.....");
		for (Iterator<String> iterator = strc.iterator(); iterator.hasNext();) {
			String type = (String) iterator.next();
			System.out.println(type+" 被输出。。。。");

		}
		System.out.println("读取写入内容结束.....");
	}

	public static void main(String[] args) throws InterruptedException {
		final LockTest lockTest = new LockTest(100);
		List<Future<Boolean>> fList = new ArrayList<Future<Boolean>>();
		Callable<Boolean> write = new Callable<Boolean>() {

			@Override
			public Boolean call() throws Exception {
				return lockTest.write("张三");
			}

		};

		ExecutorService cachedService = Executors.newCachedThreadPool();
		Future<Boolean> future = null;
		for (int i = 0; i < 100; i++) {
			future = cachedService.submit(write);
			fList.add(future);
		}

		while (true) {
			int writeLent = lockTest.strc.size() ;
			if (writeLent == 100 && fList.get(99).isDone()) {
				lockTest.read() ;
				break ;
			}
		}

	}
}



分享到:
评论

相关推荐

    JAVA多线程设计模式详解

    3. 管道模式:使用PipedInputStream和PipedOutputStream实现线程间的通信,将数据从一个线程写入,另一个线程读出。 4. 线程池模式:通过ExecutorService和ThreadPoolExecutor管理线程资源,减少线程创建和销毁的...

    java多线程nio服务器

    Java NIO服务器的多线程设计有助于提高服务器的并发性能,特别是在高并发场景下,可以有效地利用系统资源,避免大量线程导致的内存消耗和上下文切换开销。同时,通过选择器的使用,减少了对主线程的占用,使得服务器...

    读者写者问题课程设计

    【读者写者问题】是操作系统中典型的多进程同步问题,主要关注如何协调多个读者和多个写者对共享资源的访问,以确保数据的一致性。在这个课程设计中,学生需要在Linux或Windows环境下,使用C或Java语言实现一个程序...

    操作系统基础知识总结

    多线程可以在同一进程内并发执行,提高程序的执行效率。在多核处理器上,不同的线程可以被分配到不同的CPU核心上执行,从而实现真正的并行计算。 2. 进程间的通信方式 进程间通信(IPC,Inter-Process ...

    java实现聊天软件

    5. **并发与同步**:在多线程环境下,数据一致性至关重要。Java提供了各种同步机制,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`java.util.concurrent`包中的高级并发工具,如`...

    NIO.rar_NIO_java nio

    3. **选择器(Selector)**:选择器允许单线程处理多个通道,它会监视多个通道的事件(如连接打开、数据到达等),当某个通道准备好进行读写时,选择器会通知我们。这样可以避免了传统的多线程模型,减少了系统资源的...

    环 形 缓 冲区

    综上所述,环形缓冲区在单线程环境下的实现较为简单,而在多任务环境下,需要通过信号量或优化指针更新方式来处理并发访问带来的问题,以保证数据的一致性和程序的正确性。在实际应用中,开发者应根据系统需求和硬件...

    JAVA NIO 异步通信客户端

    8. **线程模型**: 由于NIO的异步特性,客户端可能使用单线程或多线程模型。单线程模型利用Selector处理所有连接,而多线程模型则为每个连接分配一个线程。前者节省线程资源,后者利于任务并行。 9. **...

    java NIO异步框架

    Java NIO(New IO)是Java 2平台标准版(J2SE 1.4)引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,极大地提升了I/O性能,并降低了多线程编程的复杂性。NIO与传统的IO(-blocking I/O)相比,最大的...

    java聊天软件(源代码)

    Java的Serializable接口标记类可以被序列化,`ObjectOutputStream`和`ObjectInputStream`则负责将对象写入和读出字节流。 6. **消息协议**: 聊天软件可能使用自定义的消息协议,比如基于JSON或XML的格式,用于...

    ddr.zip_ddr_ddr 测试_dm36x

    9. **多线程测试**:在多核或多处理环境下,测试内存的并发访问能力,查找可能出现的竞态条件或其他同步问题。 10. **电源管理**:对于嵌入式系统,测试程序可能还会涉及到DDR的低功耗模式,如自刷新(Self-Refresh...

    文件快速复制工具FastCopy.rar

    ├—使用多线程读/写/校验,重叠IO,直接IO,从而实现设备最高读写性能。 ├—可以使用 UNIX通配符 样式的 包含/排除 筛选器。 ├—运行速度快,不占资源,因为仅使用 Win32 API 和 C 运行时设计,没有使用 MFC。 ...

    《Java NIO》Download Url

    5. **管道(Pipes)**:管道是两个线程之间进行单向通信的渠道,可以将数据从一个线程写入管道,然后由另一个线程读出。 6. **多路复用器(Multiplexers)**:Java NIO中的Selector就是一种多路复用器,它可以同时...

    国嵌全部必修实验手册(第6部分_进程管道信号处理内存线程).pdf

    它由一个读端和一个写端组成,数据从写端写入,从读端读出。信号处理则是操作系统用来通知进程发生某些事件的一种机制,例如用户中断、硬件故障等。信号可以被捕获和处理,开发者可以通过编写信号处理器函数来响应...

    2023年java网络编程复习题考试题库.doc

    Java网络编程涵盖了许多重要的概念,包括输入/输出(I/O)、多线程、网络通信以及数据库操作等。以下是一些相关的知识点: 1. **线程**:Java中的线程是程序执行的最小单元,可以并发运行。Java通过Thread类来表示...

    JavaNIONIO概述Java开发Java经验技巧共4页

    - 管道是两个线程间通信的一种方式,其中一个线程写入的数据可以被另一个线程读出。Java NIO提供了Pipe类来实现这个功能。 Java NIO的使用可以显著提升I/O密集型应用的性能,尤其是在服务器端,可以利用较少的线程...

    javaNIO很好的资料

    数据可以从源端写入,从目标端读出。 #### 结论 Java NIO 通过引入 Channel、Buffer 和 Selector 等概念,提供了一种更为高效、灵活的 I/O 操作方式。相比于传统的 Java IO,NIO 在并发处理方面具有明显的优势。...

    java nio

    在实际编程中,可以结合Java NIO与Java多线程技术,构建高效的网络应用服务器,如使用Selector监听多个ServerSocketChannel,当有新的连接请求时,通过一个单独的工作线程处理这个连接的读写操作。 总之,Java NIO...

    lucene的简单介绍以及使用

    例如,在测试中,250 万条记录、约300MB的文本,生成的索引文件约为380MB,多线程环境下平均处理时间是300毫秒;而对于37000条记录,索引两个 varchar 字段,索引文件2.6MB,处理时间仅为1.5毫秒。这些数据可以作为...

Global site tag (gtag.js) - Google Analytics