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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐