koltin 协程的迷惑问题

x33g5p2x  于2021-11-24 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(444)
  1. package com.fastonetech.balance.controller
  2. import com.fastonetech.vo.AccountVo
  3. import kotlinx.coroutines.async
  4. import kotlinx.coroutines.delay
  5. import kotlinx.coroutines.runBlocking
  6. import org.junit.jupiter.api.Test
  7. import java.math.BigDecimal
  8. import java.math.RoundingMode
  9. import java.time.LocalDateTime
  10. import java.time.format.DateTimeFormatter
  11. import java.util.concurrent.TimeUnit
  12. /**
  13. * @program: balance
  14. * @description: 协程测试
  15. * @author: sunyuhua
  16. * @create: 2021-11-24 10:46
  17. **/
  18. class RunningBankTest {
  19. @Test
  20. fun testRuning(){
  21. val tenantId:Long=1L
  22. val accountVo=runBlocking {
  23. val balanceToValidPeriod =
  24. async { getBalanceAndValidPeriodTimeByTenantId(tenantId) }
  25. //余额
  26. val balance = balanceToValidPeriod.await().first.setScale(2, RoundingMode.FLOOR)
  27. //有效期
  28. val validPeriodTime =
  29. balanceToValidPeriod.await().second.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))
  30. //已消费金额
  31. val consumeAmount =
  32. async { getConsumeAmountByTenantId(tenantId).setScale(2, RoundingMode.CEILING) }
  33. //已过期金额
  34. val expireAmount =
  35. async {getExpireAmountByTenantId(tenantId).setScale(2, RoundingMode.CEILING) }
  36. //是否有现金充值(非赠金active-pay的充值)
  37. val isHasCashRecharge =
  38. async { isCashAccount(tenantId) }
  39. AccountVo(balance, validPeriodTime, consumeAmount.await(), expireAmount.await(), isHasCashRecharge.await())
  40. }
  41. //TimeUnit.SECONDS.sleep(3L)
  42. TimeUnit.SECONDS.sleep(10L)
  43. println("sss$accountVo")
  44. }
  45. /**
  46. * 模拟数据库查询计算
  47. */
  48. private suspend fun getBalanceAndValidPeriodTimeByTenantId(tenantId: Long): Pair<BigDecimal, LocalDateTime> {
  49. delay(5000L)
  50. println("getBalanceAndValidPeriodTimeByTenantId${LocalDateTime.now()}")
  51. return Pair(BigDecimal.valueOf(12.00), LocalDateTime.now())
  52. }
  53. private suspend fun getConsumeAmountByTenantId(tenantId: Long):BigDecimal{
  54. delay(4000L)
  55. println("getConsumeAmountByTenantId${LocalDateTime.now()}")
  56. return BigDecimal.valueOf(100.23)
  57. }
  58. private suspend fun getExpireAmountByTenantId(tenantId: Long):BigDecimal{
  59. delay(3000L)
  60. println("getExpireAmountByTenantId${LocalDateTime.now()}")
  61. return BigDecimal.valueOf(100.23)
  62. }
  63. private suspend fun isCashAccount(tenantId: Long):Boolean{
  64. delay(2000L)
  65. println("isCashAccount${LocalDateTime.now()}")
  66. return false
  67. }
  68. }

执行后的结果为

  1. getBalanceAndValidPeriodTimeByTenantId2021-11-24T11:10:35.525732
  2. isCashAccount2021-11-24T11:10:37.547469100
  3. getExpireAmountByTenantId2021-11-24T11:10:38.544351500
  4. getConsumeAmountByTenantId2021-11-24T11:10:39.555714700
  5. sssAccountVo(balance=12.00, validPeriodTime=2021-11-24 11:10, consumeAmount=100.23, expireAmount=100.23, isHasCashRecharge=false)

协程的怪异问题。暂时留个log,后期需要把协程搞明白再来修改

相关文章