Тайм-аут работника - PullRequest
       6

Тайм-аут работника

4 голосов
/ 12 августа 2011

Я использую SwingWorker для чтения данных по TCP-соединению и отображения при их возврате.

new SwingWorker<EnvInfoProto, Void>() {
  @Override
  public EnvInfoProto doInBackground() {
    try {   
      xxx.writeTo(socket.getOutputStream());
      return ProtoMsg.parseFrom(socket.getInputStream());
    } catch(IOException ignore) { }
    return null;
  }

  @Override
  public void done() {
    try {
      UpdateGui(get());
    } catch (Exception ignore) {}
  }
}.execute();

Проблема возникает, когда сокет мертв, например, после writeTo он вечно ждет ввода в сокет. Какой самый простой способ сделать тайм-аут через некоторое время? Является ли этот также лучшим решением в этом случае? Буду ли я по-прежнему использовать бригадир в этом решении?

Спасибо

1 Ответ

4 голосов
/ 12 августа 2011

Да, решение, на которое вы ссылаетесь, является разумным и простым решением («лучшее» настолько субъективно :) Вы можете использовать SwingWorker # get , который является частью интерфейса Future:

SwingWorker<EnvInfoProto, Void> worker = new SwingWorker<EnvInfoProto, Void>() {
    ...
};
worker.execute();
worker.get(15, TimeUnit.SECONDS); 
//will block 15 seconds at most, then throw TimeoutException

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

...