技术开发 频道

Java 7新I/O特性解析

  分组

  当你使用AsynchronousChannels时,有线程调用完整的处理程序,这些线程被绑定到一个AsynchronousChannelGroup组,这个组包含一个线程池,它封装了所有线程共享的资源,你可以使用线程池来调用这些组,AsynchronousFileChannel可以使用它自己的组创建,将ExecutorService作为一个参数传递给open()方法,在open方法中,通道是使用AsynchronousChannelGroup创建的,如果你不给它一个组,或传递一个NULL,它就会使用默认组。通道被认为是属于组的,因此,如果组关闭了,通道也就关闭了。

  你可以使用ThreadFactory创建一个组:

ThreadFactory myThreadFactory = Executors.defaultThreadFactory();

AsynchronousChannelGroup channelGroup
= AsynchronousChannelGroup.withFixedThreadPool(25, threadFactory);

  或使用一个ExecutorService:

ExecutorService service = Executors.newFixedThreadPool(25);
AsynchronousChannelGroup channelGroup
= AsynchronousChannelGroup.withThreadPool(service);

  而且你可以很容易地使用它:

AsynchronousSocketChannel socketChannel = AsynchronousSocketChannel.open(channelGroup);

  你可以使用在组上使用shutdown()方法关闭组,关闭之后,你就不能使用这个组创建更多的通道,当所有通道关闭后,组也终止了,处理程序结束,资源也释放了。

  当你使用任何类型的池和CompletionHandler时,你必须要注意一点,不要在CompletionHandler内使用阻塞或长时间操作,如果所有线程都被阻塞,整个应用程序都会被阻塞掉。如果你有自定义或缓存的线程池,它会使队列无限制地增长,最终导致OutOfMemoryError。

  我想我把新的异步I/O API涵盖的内容讲得差不多了,当然这不是一两句话可以说清楚的,也不是每一个人都会使用到它们,但在某些时候它确实很有用,Java支持这种I/O操作终归是一件好事。如果我的代码中有什么错误我表示道歉,因为我也是刚刚才接触。

  原文出处:www.baptiste-wicht.com/2010/04/java-7-new-io-features-asynchronous-operations-multicasting-random-access-with-jsr-203-nio-2/

  原文名:Java 7 : New I/O features (Asynchronous operations, multicasting, random access) with JSR 203 (NIO.2)

0
相关文章