Как вы называете этот класс, связанный с параллелизмом?И есть ли стандартная реализация? - PullRequest
5 голосов
/ 14 февраля 2011

Так как я не мог найти стандартную реализацию этого, я создал этот маленький класс, но я думаю, что кое-что простое, поскольку это должно уже существовать где-то:

class ReturnValue {
    private var value = false

    private val latch = new java.util.concurrent.CountDownLatch(1)

    def setValue(aValue: Boolean) {
        value = aValue
        latch.countDown()
    }
    def getValue() = {
        latch.await
        value
    }
}

Цель этого - обменять значениемежду двумя потоками (основной поток + EDT в моем случае).Из кода, использующего метод getValue (), он выглядит почти как Future, но реализации Future, которые я обнаружил, ожидают, что вызывающая сторона предоставит код для выполнения, что не работает в моем случае.

Так что мойвопросы:

  • Есть ли название для такой штуки?
  • Существует ли стандартная реализация для него в Java или Scala?
  • Правильна ли моя реализация??

Ответы [ 5 ]

11 голосов
/ 14 февраля 2011

Стандартная библиотека Scala предоставляет такой механизм синхронизации как scala.concurrent.SyncVar[T] класс.

Этот сеанс Scala REPL демонстрирует, как он работает:

scala> import concurrent._           
import concurrent._

scala> import ops._                  
import ops._

Я импортирую ops._ в spawnдругой Thread легко.

scala> val syncInt = new SyncVar[Int]
syncInt: scala.concurrent.SyncVar[Int] = scala.concurrent.SyncVar@17823918

scala> spawn { println("got %d" format syncInt.get) }

Я порождаю другую ветку.get блокируется до тех пор, пока не появится значение в syncInt.

scala> syncInt.isSet
res1: Boolean = false

scala> syncInt.set(103)

scala> got 103

Вышеуказанное было напечатано созданной ранее нитью.

scala> syncInt.isSet
res3: Boolean = true

scala> syncInt.get
res4: Int = 103
5 голосов
/ 14 февраля 2011

Похоже на синхронную очередь с одним элементом, где потребитель должен ждать , чтобы производитель предложил значение.

4 голосов
/ 14 февраля 2011

Для меня это выглядит бит как Обменник , за исключением того, что он более односторонний ... вы смотрели на это? По сути, вам не нужно беспокоиться о том, что вы предоставили со стороны «ожидания», или о том, что вы получили из части «предоставления».

Я согласен с вами, что это выглядит как будущее, кроме "исполняемой" части.

1 голос
/ 15 февраля 2011

Я создал очень похожую вещь, называемую BlockingReference , где мне нужно, чтобы потребители (один или несколько) могли прочитать последнее значение или блок до тех пор, пока оно не станет доступным.По сути, это похоже на отдельную очередь элементов, поскольку поток производителя может в любое время опубликовать новое значение и затем продолжить.Это актуально, когда единственная информация, которую необходимо опубликовать, это какое-то обновление статуса.Я использую его для обозначения прогресса в многопоточном кеше распределения контента (где один поток загружает контент, и есть несколько потребителей, ретранслирующих загруженные байты).Основное отличие от вас состоит в том, что вы используете одноразовое использование.

Эта реализация значительно превосходит SynchronousQueue и Exchanger, поскольку оба они блокируют поток производителя, пока не произойдет передача обслуживания.По производительности он превосходит Scala SyncVar, так как поток производителя реализован без каких-либо блокировок и функций, поскольку он может поддерживать несколько потребителей.Он был сильно оптимизирован по производительности.

Библиотека Atlassian Concurrency имеет лицензию Apache2 и находится в нашем публичном репозитории Maven.

0 голосов
/ 14 февраля 2011

Это в некоторой степени связано с программированием потока .

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