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

jdk8多线程操作文件

阅读更多
今天同事让我帮看看多线程读写文件,尝试着写了一个实例。操作的文件以块形式进行处理,块大小等于缓存大小,线程池根据cpu决定池大小。

/**
 * Created on 2016年3月18日
 */
package org.zl.test;

import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 文件以块形式进行处理,块大小等于缓存大小
 * 
 * 采用FileChannel的map方式读写文件
 * 线程池根据cpu决定池大小
 *  
 * <br>
 * change log:<br>
 * 0.01 2016年3月18日 Created <br>
 * @version 0.01
 * @author Leo
 */
public class FileRW {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		int bufferSize = 1024 * 1024;//块大小

		Path copy_from = Paths.get("d:\\web\\ajaxswing410.zip");
		//Path copy_from = Paths.get("d:\\license.txt");
		Path copy_to = Paths.get("d:\\data2.zip");
		//Path copy_to = Paths.get("d:\\l.txt");
		
		FileChannel fileChannel_from = FileChannel.open(copy_from,EnumSet.of(StandardOpenOption.READ));
		Files.deleteIfExists(copy_to);
		FileChannel fileChannel_to = FileChannel.open(copy_to,EnumSet.of(StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)); 
		ExecutorService executor = Executors.newWorkStealingPool();
		
		//分任务块
		long filesize = fileChannel_from.size();
		long bytesCount = 0;
		//List<Runnable> callables = Arrays.asList();
		while(filesize>bytesCount){
			long length=(filesize<(bytesCount+bufferSize))?filesize-bytesCount:bufferSize;
			Runnable task = new MyThread(fileChannel_from,fileChannel_to,bytesCount,length);
			executor.submit(task);
			bytesCount = bytesCount+bufferSize;
		}
		
		//线程结束关闭通道
		while(!executor.isShutdown()){
			executor.shutdown();
			TimeUnit.SECONDS.sleep(2);
		}
		fileChannel_from.close();
		fileChannel_to.close();
	}

}
class MyThread implements Runnable{

	FileChannel fileChannel_from;
	FileChannel fileChannel_to;
	long offset;
	int length;
	
	
	/**
	 * 
	 * @param fileChannel_from 读通道
	 * @param fileChannel_to 写通道
	 * @param offset 起点
	 * @param length 长度
	 */
	public MyThread(FileChannel fileChannel_from,FileChannel fileChannel_to,long offset,long length) {
		this.fileChannel_from =fileChannel_from;
		this.fileChannel_to =fileChannel_to;
		this.offset=offset;
		this.length=Long.valueOf(length).intValue();
	}
	
		/* (non-Javadoc)
		 * @see java.lang.Runnable#run()
		 */
		@Override
		public void run() {
			long startTime = System.nanoTime();
			//ByteBuffer bytebuffer = ByteBuffer.allocate(length);
			//ByteBuffer bytebuffer = ByteBuffer.allocateDirect(TestThread.bufferSize);
			//bytebuffer.flip();
			try {
				System.out.println("read:"+length);
				//fileChannel_from.read(bytebuffer, offset);
				MappedByteBuffer buffer = fileChannel_from.map(FileChannel.MapMode.READ_ONLY,offset,length);
				fileChannel_to.write(buffer,offset);
				
				//bytebuffer.clear();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		    String threadName = Thread.currentThread().getName();
		    long elapsedTime = System.nanoTime() - startTime;
		    System.out.println(threadName+" Elapsed Time is " + (elapsedTime / 1000000000.0) + " seconds");
		}
	
}



程序只做为测试,不够严谨。欢迎提意见和改进想法,看看java新特性是否能提供更便捷的代码操作。
分享到:
评论

相关推荐

    JDK 8 压缩包文件 免费分享

    这是一种函数式编程的概念,允许将函数作为一个对象进行传递,简化了多线程编程和处理集合数据的操作。例如,使用Stream API配合Lambda可以高效地处理数组和集合,使得代码更加简洁易读。 其次,Java 8新增了方法...

    jdk8安装包rpm,jdk8安装包rpm

    1. **Lambda表达式**:引入了函数式编程的概念,简化了多线程编程和事件处理。 2. **Stream API**:提供了一种处理集合的新方式,使代码更简洁、易读。 3. **方法引用和构造器引用**:允许直接引用已有方法或构造器...

    jdk8安装包(含windows和linux版本).zip

    此外,新版本还引入了默认方法,使得接口可以有实现,增强了多线程处理的并发工具,比如ForkJoinPool和Parallel Streams。 对于开发人员来说,理解JDK8的这些新特性至关重要,它们不仅提高了开发效率,还能帮助写出...

    jdk8、jkd8中文手册

    Lambda允许将匿名函数作为参数传递,或者直接定义为方法的返回值,简化了多线程处理和集合操作。 2. **函数式接口**:为了支持Lambda,Java引入了`@FunctionalInterface`注解,标记那些只有一个抽象方法的接口。...

    jdk8官方文档

    11. **并发改进**:JDK 8对并发库进行了优化,包括`ForkJoinPool`和`Parallel Streams`,提升了多线程环境下的性能。 12. **反射API的改进**:增加了`MethodHandle`和`MethodType`,提供了更底层的反射机制,增强了...

    JDK8 中文帮助文档(jdk api 1.8 google.CHM)

    JDK8对并发库也进行了增强,如`ConcurrentHashMap`的改进,新增`AtomicIntegerArray`、`LongAdder`等原子类型,以及`ForkJoinPool`和`Parallel Streams`的引入,提高了多线程环境下的性能。 **9. Nashorn ...

    jdk-8u181最新可商用jdk8 JAVA8 JDK1.8下载

    1. **Lambda表达式**:引入了函数式编程的概念,允许将代码块作为参数传递给方法,简化了多线程处理和集合操作。 2. **默认方法**:在接口中引入,默认方法允许为接口添加实现,使得向后兼容性得以保持。 3. **...

    jdk8免安装版

    8. **多线程并行**:JDK8改进了Fork/Join框架,提供了并行流,使得开发者可以轻松利用多核处理器的计算能力。 9. **类型推断增强**:JDK8的编译器能够更好地推断泛型类型的实例化,简化了代码编写。 使用这个“jdk...

    JDK8U202.zip

    1. **Lambda表达式**:JDK 8引入了Lambda表达式,这使得编写简洁、高效的多线程代码成为可能。Lambda允许将函数作为一个对象传递,简化了对集合的处理和事件驱动编程。 2. **方法引用和构造器引用**:这是与Lambda...

    jdk_8中文文档

    这份"jdk api 1.8_google"文档很可能是JDK 8的API文档,详细列出了所有类、接口、方法和常量,涵盖了核心类库、集合框架、网络编程、I/O流、多线程、反射等多个方面。通过阅读这份文档,开发者可以: 1. 学习每个类...

    JDK8压缩包

    在这个压缩包中,包含的是Windows 64位版本的JDK8,文件名为`jdk-8u171-windows-x64.exe`,这表明它是针对Windows操作系统64位架构的安装程序。 **JDK8的新特性** 1. **Lambda表达式**:这是JDK8最显著的改变之一...

    jdk8 for mac

    1. **Lambda表达式**:这是一种简洁的匿名函数表示方式,可以用于代替具有单一抽象方法的接口实现,简化多线程编程和函数式编程。 2. **Stream API**:提供了对集合操作的新接口,如过滤、映射和归约,使得处理数据...

    jdk-8u201+8u202.zip,Linux、Windows、macosx版本

    1. Lambda表达式:这是一种简洁的语法,用于表示无状态、不可变的函数,简化了多线程编程和集合操作。 2. 方法引用和构造器引用:进一步提高了代码的可读性,可以直接引用类的方法或构造器。 3. Stream API:提供了...

    jdk8免安装版.zip

    8. **改进的并发**:JDK8对并发库也做了一些优化,比如`ForkJoinPool`和`RecursiveAction`,提高了多线程环境下任务的执行效率。 9. **新的反射API**:提供了对`invokedynamic`指令的支持,使得反射更加灵活和高效...

    JDK8 API 中文 文档.CHM

    Lambda表达式可以作为参数传递,也可以用作返回值,极大地简化了对集合的处理和多线程编程。 2. **函数式接口**:为了支持lambda,Java定义了一系列函数式接口,如`Runnable`、`Callable`、`Consumer`、`Supplier`...

    jdk8绿色版(免安装)

    1. **Lambda表达式**:引入了函数式编程的概念,简化了多线程编程,如可以使用lambda表达式来创建匿名内部类,处理集合操作等。 2. **Stream API**:提供了一种新的处理数据的方式,可以对集合进行高效的操作,如...

    JDK21虚拟线程详解.pptx.pptx

    这种方式降低了上下文切换的成本,提高了并发性能,同时也降低了多线程编程的复杂性。 **JDK21虚拟线程的特性** 1. **轻量级实现**:虚拟线程不需要操作系统级别的线程,减少了创建和销毁线程的开销。 2. **协作式...

    jdk8的安装包(包含linux和windows)

    1. **Lambda表达式**:JDK8引入了Lambda表达式,这是一种简洁的匿名函数表示方式,允许开发者用更少的代码完成多线程任务,尤其是在处理集合时,极大地简化了回调函数的使用。 2. **Stream API**:Stream API是Java...

    JDK8u101 windows 64

    其中一个显著的特性是引入了Lambda表达式,这是一种函数式编程概念,使得编写简洁的多线程代码变得更加容易。此外,还有新的日期和时间API,提供了更强大的日期处理功能。改进的类型推断使得泛型的使用更加智能,而...

    JDK8最新版8u371-32位

    8. **并发改进**:`Fork/Join`框架的改进和`Parallel Streams`的引入,使得多线程并行计算更为高效。 9. **新的反射API**:JDK8提供了`java.lang.invoke.MethodHandles.Lookup`类,改进了反射机制,允许更安全和...

Global site tag (gtag.js) - Google Analytics