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

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

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

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

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

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

import scala.concurrent.Future
import scala.concurrent.blocking
import scala.util.{Failure,Success}

object BlockingIOExecutionContext {
   implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor(
      Executors.newCachedThreadPool()
   ) // create seperate thread pool for our blocking operations
}

import BlockingIOExecutionContext._ //importing our execution context for blocking operations
// alternatively if you're doing only very few IO calls just use default ExecutionContext
// import scala.concurrent.ExecutionContext.Implicits.global

val createFileFuture: Future[Path]  = Future {
  blocking { //mark this operation as blocking
    Files.createFile(Paths.get("hello"))
  }
}

createFileFuture
  .map(_.getParent) // Future is monad,so you can use map/flatMap
  .onComplete{
     case Success(parentsPath) => /* do something when file is created */
     case Failure(exception) =>  /* do something when creation fails */
  }

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

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

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

猜你在找的Java相关文章