java.nio.file.Files.createFile是阻塞调用吗?

前端之家收集整理的这篇文章主要介绍了java.nio.file.Files.createFile是阻塞调用吗? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

java.nio.file.Files.createFile是否阻塞调用线程?如是,
什么是创建文件/目录的非阻塞异步替代方法

我正在寻找可以在Java或Scala中使用的简单解决方案.

最佳答案
Files API中的所有操作都被阻止.执行createFile非阻塞方式的唯一方法是使用某种并发包装器,该包装器将在其他线程上执行该操作.

例如,您可以使用scala标准库中的Future

  1. import scala.concurrent.Future
  2. import scala.concurrent.blocking
  3. import scala.util.{Failure,Success}
  4. object BlockingIOExecutionContext {
  5. implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor(
  6. Executors.newCachedThreadPool()
  7. ) // create seperate thread pool for our blocking operations
  8. }
  9. import BlockingIOExecutionContext._ //importing our execution context for blocking operations
  10. // alternatively if you're doing only very few IO calls just use default ExecutionContext
  11. // import scala.concurrent.ExecutionContext.Implicits.global
  12. val createFileFuture: Future[Path] = Future {
  13. blocking { //mark this operation as blocking
  14. Files.createFile(Paths.get("hello"))
  15. }
  16. }
  17. createFileFuture
  18. .map(_.getParent) // Future is monad,so you can use map/flatMap
  19. .onComplete{
  20. case Success(parentsPath) => /* do something when file is created */
  21. case Failure(exception) => /* do something when creation fails */
  22. }

当您执行大量阻塞IO操作时,最好使用单独的线程池.
使用内部阻塞块也是一种好习惯,因为它使ExecutionContext知道您正在执行阻塞操作.万一您一次要执行更多阻塞调用,ExecutionContext可以决定向线程池添加更多线程.

请检查此article,以获取有关使用Scala期货的更多提示.

还有其他选择,例如cats-io,scalaz zio或monix task,但是如果您尚未使用这些库中的任何一个,我将只使用Future.

猜你在找的Java相关文章