Все операции в Файлы API блокируются.Единственный способ выполнения createFile
неблокирующего способа - это использование некоторой параллельной оболочки, которая будет выполнять эту операцию в другом потоке.
Например, вы можете использовать Future изСтандартная библиотека scala:
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 */
}
Когда вы выполняете много операций блокирования ввода-вывода, рекомендуется использовать отдельный пул потоков.Использование внутреннего блока blocking
также является хорошей практикой, поскольку оно позволяет ExecutionContext знать, что вы выполняете операцию блокировки.В случае, если вы будете делать больше блокирующих вызовов одновременно, ExecutionContext может решить добавить больше потоков в пул потоков.
Пожалуйста, ознакомьтесь с этой статьей для получения дополнительных советов по использованию scala futures.
Существуют и другие альтернативы, такие как cats-io , scalaz zio или monix task , но если вы не используете ни одну из этих библиотекя бы уже остался с Future .