I was bitten by the issue described in https://stackoverflow.com/a/31052486/6253347 \[cpovirk adds (for searchability): might https://stackoverflow.com/q/55333290/28465 also be similar?\] when trying to use Arrow Flight with Java's SecurityManager, since `AbstractFuture` tries to check a property as part of initialization and hence can't be created from an `InnocuousThread` that doesn't have any privileges. The exception looks like this:

```
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "guava.concurrent.generate_cancellation_cause" "read")
	at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
	at java.base/java.security.AccessController.checkPermission(AccessController.java:1044)
	at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:408)
	at java.base/java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1152)
	at java.base/java.lang.System.getProperty(System.java:880)
	at com.google.common.util.concurrent.AbstractFuture.<clinit>(AbstractFuture.java:64)
```

I can try to put together a small repro if it's useful, but the TL;DR is that I'd like to wrap the call at https://github.com/google/guava/blob/master/guava/src/com/google/common/util/concurrent/AbstractFuture.java#L74 in a try/catch, since it will throw if access to system properties is not permitted by the SecurityManager.
if (!isDone()) {
      Listener oldHead = listeners;
      if (oldHead != Listener.TOMBSTONE) {
        Listener newNode = new Listener(listener, executor);
        do {
          newNode.next = oldHead;
          if (ATOMIC_HELPER.casListeners(this, oldHead, newNode)) {
            return;
          }
          oldHead = listeners; 
        } while (oldHead != Listener.TOMBSTONE);
      }
    }
    
    
    executeListener(listener, executor);
  }
  /**
   * Sets the result of this {@code Future} unless this {@code Future} has already been cancelled or
   * set (including {@linkplain #setFuture set asynchronously}). When a call to this method returns,
   * the {@code Future} is guaranteed to be {@linkplain #isDone done} <b>only if</b> the call was
   * accepted (in which case it returns {@code true}). If it returns {@code false}, the {@code
   * Future} may have previously been set asynchronously, in which case its result may not be known
   * yet. That result, though not yet known, cannot be overridden by a call to a {@code set*}
   * method, only by a call to {@link #cancel}.
   *
   * @param value the value to be used as the result
   * @return true if the attempt was accepted, completing the {@code Future}
   */
  @CanIgnoreReturnValue