TQueue[A]
是一个可以参与 STM 事务的可变队列。
创建一个 TQueue
创建一个具有指定容量的空的有界 TQueue
:
import zio._
import zio.stm._
val tQueueBounded: STM[Nothing, TQueue[Int]] = TQueue.bounded[Int](5)
创建一个空的无容量限制的 TQueue
:
import zio._
import zio.stm._
val tQueueUnbounded: STM[Nothing, TQueue[Int]] = TQueue.unbounded[Int]
将元素加入一个 TQueue
将元素放入一个 TQueue
:
import zio._
import zio.stm._
val tQueueOffer: UIO[TQueue[Int]] = (for {
tQueue <- TQueue.bounded[Int](3)
_ <- tQueue.offer(1)
} yield tQueue).commit
如果队列未满,则指定的元素将被成功添加到队列中。否则,它将等待队列中的空插槽位。
另外,您可以使用一个元素列表来填充队列:
import zio._
import zio.stm._
val tQueueOfferAll: UIO[TQueue[Int]] = (for {
tQueue <- TQueue.bounded[Int](3)
_ <- tQueue.offerAll(List(1, 2))
} yield tQueue).commit
从 TQueue 中取回元素
您可以从队列中取回第一个元素,如下例:
import zio._
import zio.stm._
val tQueueTake: UIO[Int] = (for {
tQueue <- TQueue.bounded[Int](3)
_ <- tQueue.offerAll(List(1, 2))
res <- tQueue.take
} yield res).commit
如果队列为空,它将阻塞等待您所期待的元素。
可以通过使用 poll
方法来避免此阻塞行为,该方法将返回一个元素(如果存在)否则返回 None:
import zio._
import zio.stm._
val tQueuePoll: UIO[Option[Int]] = (for {
tQueue <- TQueue.bounded[Int](3)
res <- tQueue.poll
} yield res).commit
取回队列的前n个元素:
import zio._
import zio.stm._
val tQueueTakeUpTo: UIO[List[Int]] = (for {
tQueue <- TQueue.bounded[Int](4)
_ <- tQueue.offerAll(List(1, 2))
res <- tQueue.takeUpTo(3)
} yield res).commit
可以按以下方式获取队列的所有元素:
import zio._
import zio.stm._
val tQueueTakeAll: UIO[List[Int]] = (for {
tQueue <- TQueue.bounded[Int](4)
_ <- tQueue.offerAll(List(1, 2))
res <- tQueue.takeAll
} yield res).commit
TQueue 的大小
可以按以下方式获取队列中元素的个数:
import zio._
import zio.stm._
val tQueueSize: UIO[Int] = (for {
tQueue <- TQueue.bounded[Int](3)
_ <- tQueue.offerAll(List(1, 2))
size <- tQueue.size
} yield size).commit