Поскольку вы не можете использовать Callable (и я полагаю, вы также не можете использовать Future), вы можете попытаться создать свое собственное Future.Это относительно просто:
public class MyFuture<T>{ // can you not use generics either?
private final Object lock = new Object();
private T value;
public void set(T t){
synchronized(lock){
value = t;
lock.notifyAll();
}
}
public T get(){
synchronized(lock){
while(value == null) lock.wait();
return value;
}
}
}
Теперь вы можете иметь SavedJSON.result
быть MyFuture
, и когда кто-то хочет получить значение и ему нужно подождать, он может просто вызвать SavedJSON.result.get();
, и набор, очевидно, может быть SavedJSON.result.set(new JSONObject(new String(baos.toByteArray())));
Редактировать:
Это адрес вашего комментария и редактирование.
Первое: вы можете распространить прерванное исключение.Обычно потоки пытаются «остановить» другие потоки с использованием прерывания.Вы можете либо добавить в метод объявление throws, либо сгенерировать исключение времени выполнения, либо просто вернуть нулевое значение.
Второе: вы не должны иметь значение = t вне синхронизированного блока.По разным причинам это может потерпеть неудачу.Вы должны удалить эту строку, и она выглядит довольно хорошо.