Как установить название следующей темы Future в Scala? - PullRequest
0 голосов
/ 10 ноября 2019

Когда новый поток создается с использованием черты scala.concurrent.Future, имя нового потока генерируется автоматически.

import java.lang.Thread
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

Future { 
  println(Thread.currentThread().getName()) 
}

// Result is: ForkJoinPool-1-worker-29

Как я могу задать имя следующего потока, созданного чертой Future?


Примечание: это может быть полезно, особенно при регистрации имени потока, чтобы у вас было лучшее представление о том, что происходит (какой поток делает что).

Например, мойконфигурация log4j %d{yyyy-MM-ddTHH:mm:ss.SSS} [%t] %p: %m%n. %t показывает имя потока. Позволяя Scala решить, что имя без шва, я бы предпочел выбрать имя потока самостоятельно.

1 Ответ

0 голосов
/ 10 ноября 2019

Мне удалось сделать это с помощью пользовательского ThreadFactory, который создает новый Thread с нужным именем.

Все, что вам нужно сделать, это указать желаемое имя, прежде чем объявить новоеFuture объект, как показано ниже:

import java.lang.Thread
import scala.concurrent.Future

// Import the custom implementation, which is elaborated below
import cz.jkozlovsky.scala.utils.Concurrent._

nextFutureThreadName("FuturesEverywhere")

Future {
  println(Thread.currentThread().getName()) 
}

// Result is: FuturesEverywhere

Вот определение моего Concurrent объекта:

package cz.jkozlovsky.scala.utils

import java.util.concurrent.{ExecutorService, Executors, ThreadFactory}

import scala.concurrent.{ExecutionContext, ExecutionContextExecutor}

/** Custom concurrency object to enable custom thread names.
  */
object Concurrent {

  protected var desiredThreadName: Option[String] = None

  protected val globalThreadFactory: ThreadFactory = {
    runnable: Runnable =>
      if (desiredThreadName.isDefined) {

        val name = desiredThreadName.get
        desiredThreadName = None

        new Thread(runnable, name)
      } else {
        new Thread(runnable)
      }
  }

  protected val globalThreadPool: ExecutorService = Executors.newFixedThreadPool(
    10,
    globalThreadFactory
  )

  /** Sets the name of the next thread created by the [[scala.concurrent.Future]] trait.
    */
  def nextFutureThreadName(name: String): Unit = desiredThreadName = Some(name)

  implicit val executionContext: ExecutionContextExecutor =
    ExecutionContext.fromExecutor(globalThreadPool)
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...