Что лучший способ состоит в том, чтобы вытащить возвращаемое значение из asyncExec в Eclipse?

Вы можете использовать предварительное утверждение:

$string = 'DZ9243/XSHAGT FFGD JERSE XS2 DZ9232/MHAGT SUUMTE KNI M10 DZ9232/LHAGT SUMMER KNI L6';
$pieces = preg_split('@ (?=[^ ]*/)@', $string);

print_r($pieces);

Вывод:

Array
(
    [0] => DZ9243/XSHAGT FFGD JERSE XS2
    [1] => DZ9232/MHAGT SUUMTE KNI M10
    [2] => DZ9232/LHAGT SUMMER KNI L6
)

Регулярное выражение

@ (?=[^ ]*/)@
  • @ разделитель regex ; обычно в качестве разделителя используется /, но это регулярное выражение пытается сопоставить /, и поэтому лучше использовать другой разделитель;
  • за ним следует пробел; это пространство, которое вы хотите использовать в качестве разделителя для разделения входной строки;
  • ( запускает группу; группа нужна утверждению;
  • ?= - положительное утверждение, ориентированное на будущее; требует, чтобы группа соответствовала входной строке, но не потребляет символы из входной строки, которая соответствует группе;
  • [^ ]*/ - содержимое группы; он соответствует любому непробельному символу любое количество раз, за ​​которым следует /; это слово содержит косую черту (/);
  • ) оканчивает группу.

В целом, regex соответствует пробелам, за которыми следует слово, которое содержит косую черту, но слово не используется; он не включен в разделитель в preg_split(), используется только пробел.

6
задан Lii 5 July 2017 в 08:44
поделиться

3 ответа

Вы, вероятно, не должны предполагать что асинхронное Runnable закончится к этому времени asyncExec назовите возвраты.

В этом случае Вы смотрите на выставление результата в слушателей/обратные вызовы (возможно Шаблон "команда"), или если Вы действительно хотите иметь результат в наличии в более позднем в том же методе, с помощью чего-то как a java.util.concurrent.Future.

4
ответ дан 9 December 2019 в 20:50
поделиться

Я думаю, что Контейнер выше является "правильным" выбором. Это могло быть также быть genericized для безопасности типов. Быстрым выбором в этом виде ситуации является заключительная идиома массива. Прием - то, что любой локальные переменные, на которые ссылаются от Выполнимого, должны быть окончательными, и таким образом не могут быть изменены. Таким образом вместо этого, Вы используете единственный массив элемента, где массив является окончательным, но элемент массива может быть изменен:

final Object[] result = new Object[1];
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
  public void run()
  {
    result[0] = "foo";
  }
}
System.out.println(result[0]);

Снова, это - "быстрое" решение для тех случаев, где у Вас есть анонимный класс, и Вы хотите дать ему место для засовывания результата, не определяя определенный Контейнерный класс.

ОБНОВЛЕНИЕ После того, как я думал об этом немного, я понял, что это хорошо работает для использования типа слушателя и посетителя, где обратный вызов находится в том же потоке. В этом случае, однако, Выполнимое выполняется в другом потоке, таким образом, Вы, как гарантируют, на самом деле не будете видеть результат после syncExec возвраты. Правильное решение состоит в том, чтобы использовать AtomicReference:

final AtomicReference<Object> result = new AtomicReference<Object>();
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
  public void run()
  {
    result.set("foo");
  }
}
System.out.println(result.get());

Изменения в значении AtomicReference, как гарантируют, будут видимы всеми потоками, так же, как если бы это было объявлено энергозависимое. Это описано подробно здесь.

8
ответ дан 9 December 2019 в 20:50
поделиться

Ну, если это - синхронизация, у Вас может просто быть держатель значения некоторого вида, внешнего к run() метод.

Классик:

final Container container = new Container();
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
  public void run()
  {
    container.setValue("foo");
  }
}
System.out.println(container.getValue());

Где контейнер справедлив:

public class Container {
  private Object value;
  public Object getValue() {
    return value;
  }
  public void setValue(Object o) {
    value = o;
  }
}

Это, конечно, весело и изворотливо (еще более изворотливый, создает новый Список и затем устанавливает и получает 1-й элемент), но syncExec блоки метода, таким образом, ничто плохо не вышло из него.

Кроме тех случаев, когда кто-то возвращается позже и делает его asyncExec()..

0
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: