Java7新特性
Switch语句支持字符串
1 2 3 4 5 6 7 8 |
switch ( args[0] ){ case "Hello": break; case "World": break; default: break; } |
try()结构
1 2 3 4 |
// try可以附加资源管理的代码,这些资源如果实现AutoCloseable接口,那么会被自动关闭 try (OutputStream out = System.out;InputStream in = System.in){} catch ( IOException e ){} finally{} |
多重捕获
1 2 |
try{} catch ( NullPointerException | IllegalArgumentException e ){} |
二进制字面值
1 |
int i255 = 0b11111111; |
数字下划线分隔符
1 |
long lightYear = 9454_254_955_488L; |
泛型类型自动推演
1 2 3 4 5 |
//钻石操作符,参数化类型会根据上下文推断 List = new ArrayList<>(); private static List genList(){ return new ArrayList<>(); } |
Fork/Join框架
Fork/Join模式是处理并行编程的经典模式,Java 7将其集成到JDK中,Java7 的Fork/Join框架可以很好的利用多核CPU来完成复杂的计算任务。Fork/Join的思想是,把计算任务分为两个阶段:
- 分解阶段:把任务分解为多个不相关的小块,分别有多个线程进行计算
- 合并阶段:计算完成的小块被合并到最终结果中
Map/Reduce本质上是Fork/Join模式的一种变体,但是它主要用于分布式计算领域。
需要注意的是,Java7的Fork/Join框架支持递归的分解和合并,子任务可以继续分解为更细致的任务并在完成后合并,下图形象的说明了递归分解/合并过程:
下面是一个利用Fork/Join求和的例子,该例子中任务会不断分解子任务,直到需要相加的只剩两个数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public class SumTask extends RecursiveTask<Long> { private static final long serialVersionUID = 1L; private SumProblem problem; public SumTask( SumProblem problem ) { this.problem = problem; } @Override protected Long compute() { if ( problem.numCount() <= 2 ) { //只剩下两个数的话,相加并返回 return problem.solve(); } else { //任务分割,把绝大部分计算内容切分出去 SumProblem subProblem = problem.chop(); //当然,类似于均分的方式来切分任务也是可以的 SumTask subTask = new SumTask( subProblem ); subTask.fork();//让子任务分支出去,即另外调度执行 Long result = problem.solve(); //当前任务执行主任务 return result + subTask.join(); //当前任务负责合并结果 //注意,这里的join不要理解为线程的join,实际上,执行join时,当前任务会被执行线程放弃 } } } public class ForkJoinTest { public static void main( String[] args ) { int processerCount = Runtime.getRuntime().availableProcessors(); //ForkJoinPool负责发现并执行任务生成的子任务 ForkJoinPool pool = new ForkJoinPool( processerCount ); ForkJoinTask<Long> task = new SumTask( new SumProblem( 1L, 1000L ) ); System.out.println( pool.invoke( task ) ); } } |
NIO.2
Java New I/O是JDK1.4引入的新API,支持异步方式处理输入输出,大大改善了I/O性能。Java 7对NIO进行了很多的增强,此称为NIO.2。
使用Java进行网络编程一文包含了部分NIO2特性在网络编程方面的应用。
NIO.2引入了全新的软件包java.nio.file,下面是一些使用该包的样例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//Path用来定位文件系统中的文件 Path path = FileSystems.getDefault().getPath( "F:/Temp/ReadMe.txt" ); //Files是一个工具类 Files.exists( path );//判断对应Path的文件是否存在 Files.newBufferedReader( path, Charset.forName( "UTF-8" ) ); //打开字符流 /* * WatchService可以用来监听特定类型的文件系统事件: * ENTRY_CREATE 目录中创建或者重命名(进入)了一个条目 * ENTRY_DELETE 目录中删除或者重命名(出去)了一个条目 * ENTRY_MODIFY 目录中的一个条目被修改 */ path = FileSystems.getDefault().getPath( "F:/Temp/" ); WatchService watcher = FileSystems.getDefault().newWatchService(); WatchKey watchKey = path.register( watcher, StandardWatchEventKinds.ENTRY_DELETE ); for ( ;; ) { WatchKey key = watcher.take(); //阻塞,直到有事件发生 if ( key.equals( watchKey ) ) for ( WatchEvent<?> e : key.pollEvents() ) { System.out.println( "File deleted: " + e.context() ); } key.reset(); //重置Key以继续接收事件 } |
Leave a Reply