`

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

阅读更多
把项目中一个大文件对比进行了简单了模拟,多线程将大文件下的多个文件分割,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程序 两个线程实现学生成绩的读写

    java程序(利用线程)。一个线程往成绩单中写入课程名和成绩,一个线程从成绩单中读出课程和成绩,并将课程和成绩显示在屏幕上。

    文件快速复制工具FastCopy.rar

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

    UNIX网络编程 卷2:进程间通信

     16.2 多线程化 330  16.3 服务器捆绑 333  16.4 认证 336  16.5 超时和重传 338  16.6 调用语义 342  16.7 客户或服务器的过早终止 343  16.8 XDR:外部数据表示 345  16.9 RPC分组格式 361  16.10 小结 ...

    《UNIX网络编程 第2版. 第2卷, 进程间通信(中文版)》(W·Richard Stevens[美] 著)

    16.2 多线程化 330 16.3 服务器捆绑 333 16.4 认证 336 16.5 超时和重传 338 16.6 调用语义 342 16.7 客户或服务器的过早终止 343 16.8 XDR:外部数据表示 345 16.9 RPC分组格式 361 16.10 小结 365 习题 366 后记 ...

    UNIX网络编程 第2卷 进程间通信

    16.2 多线程化 330 16.3 服务器捆绑 333 16.4 认证 336 16.5 超时和重传 338 16.6 调用语义 342 16.7 客户或服务器的过早终止 343 16.8 XDR:外部数据表示 345 16.9 RPC分组格式 361 16.10 小结 365 习题 366 后记 ...

    UNIX网络编程 卷2 进程间通信 带完整书签,完整目录

    16.2 多线程化 330 16.3 服务器捆绑 333 16.4 认证 336 16.5 超时和重传 338 16.6 调用语义 342 16.7 客户或服务器的过早终止 343 16.8 XDR:外部数据表示 345 16.9 RPC分组格式 361 16.10 小结 365 习题 ...

    API之网络函数---整理网络函数及功能

    其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及...

    易语言程序免安装版下载

    “库文件名”以.lib或.obj为后缀的将被视为静态库,可使用绝对路径或相对路径(相对当前源代码所在目录),如依赖多个静态库请分别列出并以逗号分隔;“在库中的对应命令名”请务必准确填写静态库中公开导出的符号...

    Visual C++ 编程资源大全(源码 控件)

    (10KB)&lt;END&gt;&lt;br&gt;46,treestore.zip 将树的结构存入一个文本文件,可以读出及写入数的结构。(41KB)&lt;END&gt;&lt;br&gt;47,MultControl.zip 这是一个多列的树/列表控制类库(87KB)&lt;END&gt;&lt;br&gt;48,printctrl.zip 一个支持打印...

    Android 开发技巧

    9.44、检查SD卡是否存在并且可以写入 267 9.45、获取SD卡的路径和存储空间 268 9.46、将程序安装到SD卡 268 9.47、创建一个SD映像 269 9.48、查看手机内存存储 269 9.49、在模拟器上调试GOOGLE MAPS 271 9.50、建立...

    Android开发资料合集-World版!

    9.44、检查SD卡是否存在并且可以写入 267 9.45、获取SD卡的路径和存储空间 268 9.46、将程序安装到SD卡 268 9.47、创建一个SD映像 269 9.48、查看手机内存存储 269 9.49、在模拟器上调试GOOGLE MAPS 271 9.50、建立...

Global site tag (gtag.js) - Google Analytics