Java многопоточность JavaDoc - PullRequest
       2

Java многопоточность JavaDoc

5 голосов
/ 23 сентября 2010

Я написал метод, который должен вызываться только в определенном потоке.Есть ли стандартная аннотация или примечание, которое должно быть добавлено к javadoc метода, чтобы обозначить это?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Не знаю ни одной такой стандартной аннотации. Параллелизм Java на практике рассматривает вопрос в разделе 4.5: Документирование политик синхронизации .Несколько советов, которые, надеюсь, помогут вам сделать вашу документацию ясной и полезной:

По крайней мере, документируйте гарантии безопасности потоков, сделанные классом.Это потокобезопасно?Делает ли обратные вызовы с удерживаемой блокировкой?Существуют ли какие-либо конкретные блокировки, которые влияют на его поведение?Не заставляйте клиентов делать рискованные догадки.Если вы не хотите поддерживать блокировку на стороне клиента, это нормально, но так и скажите.Если вы хотите, чтобы клиенты могли создавать новые атомарные операции в вашем классе, как мы это делали в Разделе 4.4, вам нужно документировать, какие блокировки они должны получить, чтобы сделать это безопасно.Если вы используете блокировки для защиты состояния, запишите это для будущих сопровождающих, потому что это так просто - аннотация @GuardedBy поможет.Если вы используете более тонкие средства для обеспечения безопасности потоков, запишите их, потому что они могут быть неочевидны для сопровождающих.

Они также используют некоторые аннотации, которые не являются стандартными, но рекомендуются ими (см. Приложение A).).Тем не менее, для методов они предлагают только варианты @GuardedBy, что не применимо к вашему случаю.

Я рекомендую просто четко документировать требование в простом Javadoc.

0 голосов
/ 23 сентября 2010

На мой взгляд, лучший способ справиться с этим - снять требование. Измените метод на private и слегка переименуйте его, добавив слово Workload или Internal или что-то еще. Затем создайте новый публичный метод с той же подписью. Пусть этот метод проверит, чтобы убедиться, что вы находитесь в правильном потоке. Если да, вы можете просто выполнить приватный метод. Если нет, то запланируйте выполнение приватного метода в правильном потоке. Таким образом, пользователь API не должен беспокоиться о потоках и может просто вызвать метод.

Тогда в javadoc указывать нечего, хотя по-прежнему полезно включать эту информацию в описание открытых и закрытых методов.

Это шаблон, который я использую, когда мне нужно что-то выполнить на EDT:

/**
 * Executes something on the EDT with the crazy argument specified.  If this is
 * called outside of the EDT, it will schedule the work to be done on the EDT
 * as soon as possible. The actual work of this method is found in
 * {@link #executeSomethingInternal(int)}.
 *
 * @argument crazyArgument some crazy argument
 */
public void executeSomething(int crazyArgument) {
  if (SwingUtilities.isEventDispatchThread()) {
    this.executeSomethingInternal(crazyArgument);
  } else {
    Runnable r = new Runnable() {
      private int crazyArgument;

      public Runnable setCrazyArgument(int crazyArgument) {
        this.crazyArgument = crazyArgument;
        return this;
      }

      @Override
      public void run() {
        this.OuterClass.executeSomethingInternal(this.crazyArgument);
      }
    }.setCrazyArgument(crazyArgument);
    SwingUtilities.invokeLater(r);
  }
}

/**
 * This method actually does the work.  It is guaranteed by this class to
 * always get called on the EDT.  Users of this API should call
 * {@link #executeSomething(int)}.
 */

private void executeSomethingInternal(int crazyArgument) {
  // do work here
}
...