Мне удалось сделать это с помощью пользовательского 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)
}