今天同事让我帮看看多线程读写文件,尝试着写了一个实例。操作的文件以块形式进行处理,块大小等于缓存大小,线程池根据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新特性是否能提供更便捷的代码操作。
分享到:
相关推荐
这是一种函数式编程的概念,允许将函数作为一个对象进行传递,简化了多线程编程和处理集合数据的操作。例如,使用Stream API配合Lambda可以高效地处理数组和集合,使得代码更加简洁易读。 其次,Java 8新增了方法...
1. **Lambda表达式**:引入了函数式编程的概念,简化了多线程编程和事件处理。 2. **Stream API**:提供了一种处理集合的新方式,使代码更简洁、易读。 3. **方法引用和构造器引用**:允许直接引用已有方法或构造器...
Lambda允许将匿名函数作为参数传递,或者直接定义为方法的返回值,简化了多线程处理和集合操作。 2. **函数式接口**:为了支持Lambda,Java引入了`@FunctionalInterface`注解,标记那些只有一个抽象方法的接口。...
11. **并发改进**:JDK 8对并发库进行了优化,包括`ForkJoinPool`和`Parallel Streams`,提升了多线程环境下的性能。 12. **反射API的改进**:增加了`MethodHandle`和`MethodType`,提供了更底层的反射机制,增强了...
JDK8对并发库也进行了增强,如`ConcurrentHashMap`的改进,新增`AtomicIntegerArray`、`LongAdder`等原子类型,以及`ForkJoinPool`和`Parallel Streams`的引入,提高了多线程环境下的性能。 **9. Nashorn ...
1. **Lambda表达式**:引入了函数式编程的概念,允许将代码块作为参数传递给方法,简化了多线程处理和集合操作。 2. **默认方法**:在接口中引入,默认方法允许为接口添加实现,使得向后兼容性得以保持。 3. **...
8. **多线程并行**:JDK8改进了Fork/Join框架,提供了并行流,使得开发者可以轻松利用多核处理器的计算能力。 9. **类型推断增强**:JDK8的编译器能够更好地推断泛型类型的实例化,简化了代码编写。 使用这个“jdk...
此外,新版本还引入了默认方法,使得接口可以有实现,增强了多线程处理的并发工具,比如ForkJoinPool和Parallel Streams。 对于开发人员来说,理解JDK8的这些新特性至关重要,它们不仅提高了开发效率,还能帮助写出...
1. **Lambda表达式**:JDK 8引入了Lambda表达式,这使得编写简洁、高效的多线程代码成为可能。Lambda允许将函数作为一个对象传递,简化了对集合的处理和事件驱动编程。 2. **方法引用和构造器引用**:这是与Lambda...
在这个压缩包中,包含的是Windows 64位版本的JDK8,文件名为`jdk-8u171-windows-x64.exe`,这表明它是针对Windows操作系统64位架构的安装程序。 **JDK8的新特性** 1. **Lambda表达式**:这是JDK8最显著的改变之一...
1. **Lambda表达式**:这是一种简洁的匿名函数表示方式,可以用于代替具有单一抽象方法的接口实现,简化多线程编程和函数式编程。 2. **Stream API**:提供了对集合操作的新接口,如过滤、映射和归约,使得处理数据...
这份"jdk api 1.8_google"文档很可能是JDK 8的API文档,详细列出了所有类、接口、方法和常量,涵盖了核心类库、集合框架、网络编程、I/O流、多线程、反射等多个方面。通过阅读这份文档,开发者可以: 1. 学习每个类...
1. Lambda表达式:这是一种简洁的语法,用于表示无状态、不可变的函数,简化了多线程编程和集合操作。 2. 方法引用和构造器引用:进一步提高了代码的可读性,可以直接引用类的方法或构造器。 3. Stream API:提供了...
8. **改进的并发**:JDK8对并发库也做了一些优化,比如`ForkJoinPool`和`RecursiveAction`,提高了多线程环境下任务的执行效率。 9. **新的反射API**:提供了对`invokedynamic`指令的支持,使得反射更加灵活和高效...
Lambda表达式可以作为参数传递,也可以用作返回值,极大地简化了对集合的处理和多线程编程。 2. **函数式接口**:为了支持lambda,Java定义了一系列函数式接口,如`Runnable`、`Callable`、`Consumer`、`Supplier`...
1. **Lambda表达式**:引入了函数式编程的概念,简化了多线程编程,如可以使用lambda表达式来创建匿名内部类,处理集合操作等。 2. **Stream API**:提供了一种新的处理数据的方式,可以对集合进行高效的操作,如...
这种方式降低了上下文切换的成本,提高了并发性能,同时也降低了多线程编程的复杂性。 **JDK21虚拟线程的特性** 1. **轻量级实现**:虚拟线程不需要操作系统级别的线程,减少了创建和销毁线程的开销。 2. **协作式...
其中一个显著的特性是引入了Lambda表达式,这是一种函数式编程概念,使得编写简洁的多线程代码变得更加容易。此外,还有新的日期和时间API,提供了更强大的日期处理功能。改进的类型推断使得泛型的使用更加智能,而...
1. **Lambda表达式**:JDK8引入了Lambda表达式,这是一种简洁的匿名函数表示方式,允许开发者用更少的代码完成多线程任务,尤其是在处理集合时,极大地简化了回调函数的使用。 2. **Stream API**:Stream API是Java...
8. **并发改进**:`Fork/Join`框架的改进和`Parallel Streams`的引入,使得多线程并行计算更为高效。 9. **新的反射API**:JDK8提供了`java.lang.invoke.MethodHandles.Lookup`类,改进了反射机制,允许更安全和...