У меня довольно сложный проект, который в значительной степени использует многопоточность Java. В ответе на один из моих предыдущих вопросов я описал уродливый хак, который должен преодолеть присущую невозможности повторять итерацию по Java ConcurrentHashMap
параллельно. Хотя это работает, мне не нравятся уродливые хаки, и у меня было много проблем с попыткой представить предлагаемое доказательство концепции в реальной системе. Пытаясь найти альтернативное решение, я столкнулся с ParHashMap
от Scala, который утверждает, что реализует метод foreach
, который, похоже, работает параллельно. Прежде чем я начну изучать новый язык для реализации единой функции, я хотел бы задать следующие вопросы:Использование Scala ParHashMap в проекте Java вместо ConcurrentHashMap
1) Есть foreach
метод Scala's ParHashMap
масштабируемый?
2) Простой и понятный код Java от Scala и наоборот? Напомню, что код является параллельным и использует generics.
3) Будет ли штраф за исполнение для переключения части кода на Scala?
Для справки, это мой предыдущий вопрос о параллельной итерации ConcurrentHashMap
:
Scalable way to access every element of ConcurrentHashMap<Element, Boolean> exactly once
EDIT
Я осуществил доказательство концепции, в вероятно, очень не-идиоматических Scala, но он работает отлично. AFAIK НЕВОЗМОЖНО реализовать соответствующее решение в Java с учетом текущего состояния его стандартной библиотеки и любых доступных сторонних библиотек.
import scala.collection.parallel.mutable.ParHashMap
class Node(value: Int, id: Int){
var v = value
var i = id
override def toString(): String = v toString
}
object testParHashMap{
def visit(entry: Tuple2[Int, Node]){
entry._2.v += 1
}
def main(args: Array[String]){
val hm = new ParHashMap[Int, Node]()
for (i <- 1 to 10){
var node = new Node(0, i)
hm.put(node.i, node)
}
println("========== BEFORE ==========")
hm.foreach{println}
hm.foreach{visit}
println("========== AFTER ==========")
hm.foreach{println}
}
}
Спасибо за отличный ответ. Я не знал о JavaConverters, но они звучат довольно удивительно. Большое спасибо за то, что указали мне на исследовательскую статью, я буду внимательно ее читать. На данном этапе мне кажется, что я могу ограничить свой код scala всего несколькими слоями, выставить Java-API и решить проблему к полуночи :). Хуже всего будет изучать совершенно новый синтаксис, но, надеюсь, Scala будет полезен в будущем! Большое спасибо! –
Рад помочь. Удачи с вашим проектом! – Vidya
Оценки, представленные в документе, по-видимому, имеют отношение к моему использованию, поскольку метод, который я вызываю при повторном использовании элементов, очень легкий. Приятно, что авторы сравнили свои реализации с легкими операциями, поскольку это обеспечивает гораздо более сложную задачу для параллелизма. –