java.nio.file并发写_java.nio.file.Files.createFile是阻塞调用吗?

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值