加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 19:29:53 所属栏目:Java 来源:网络整理
导读:java.nio.file.Files.createFile是否阻塞调用线程?如是, 什么是创建文件/目录的非阻塞异步替代方法? 我正在寻找可以在Java或Scala中使用的简单解决方案. 最佳答案 Files API中的所有操作都被阻止.执行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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读