All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.firebase.ThreadManager Maven / Gradle / Ivy

Go to download

This is the official Firebase Admin Java SDK. Build extraordinary native JVM apps in minutes with Firebase. The Firebase platform can power your app’s backend, user authentication, static hosting, and more.

There is a newer version: 9.3.0
Show newest version
/*
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.firebase;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.firebase.internal.NonNull;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadFactory;

/**
 * An interface that controls the thread pools and thread factories used by the Admin SDK. Each
 * instance of {@link FirebaseApp} uses an implementation of this interface to create and manage
 * threads.
 *
 * 

Multiple app instances may use the same ThreadManager instance. * Methods in this interface may get invoked multiple times by the same * app, during its lifetime. Apps may also invoke methods of this interface concurrently and * so implementations should provide any synchronization necessary. */ public abstract class ThreadManager { @NonNull final FirebaseExecutors getFirebaseExecutors(@NonNull FirebaseApp app) { return new FirebaseExecutors(getExecutor(app)); } final void releaseFirebaseExecutors( @NonNull FirebaseApp app, @NonNull FirebaseExecutors executor) { releaseExecutor(app, executor.userExecutor); } /** * Returns the main thread pool for an app. Implementations may return the same instance of * ExecutorService for multiple apps. The returned thread pool is used for * short-lived tasks by all components of an app. * *

For long-lived tasks (such as the ones started by the Realtime Database client), the SDK * creates dedicated executors using the ThreadFactory returned by the * {@link #getThreadFactory()} method. * * @param app A {@link FirebaseApp} instance. * @return A non-null ExecutorService instance. */ @NonNull protected abstract ExecutorService getExecutor(@NonNull FirebaseApp app); /** * Cleans up the thread pool associated with an app. This method is invoked when an app * is deleted. This is guaranteed to be called with the ExecutorService previously * returned by {@link #getExecutor(FirebaseApp)} for the corresponding app. * * @param app A {@link FirebaseApp} instance. */ protected abstract void releaseExecutor( @NonNull FirebaseApp app, @NonNull ExecutorService executor); /** * Returns the ThreadFactory to be used for creating long-lived threads. This is * used mainly to create the long-lived worker threads for the Realtime Database client, and * other scheduled (periodic) tasks started by the SDK. The SDK guarantees * clean termination of all threads started via this ThreadFactory, when the user * calls {@link FirebaseApp#delete()}. * *

If long-lived threads cannot be supported in the current runtime, this method may * throw a {@code RuntimeException}. * * @return A non-null ThreadFactory. */ @NonNull protected abstract ThreadFactory getThreadFactory(); /** * Wraps an ExecutorService in a ListeningExecutorService while keeping a reference to the * original ExecutorService. This reference is used when it's time to release/cleanup the * original ExecutorService. */ static final class FirebaseExecutors { private final ExecutorService userExecutor; private final ListeningExecutorService listeningExecutor; private FirebaseExecutors(ExecutorService userExecutor) { this.userExecutor = checkNotNull(userExecutor, "ExecutorService must not be null"); this.listeningExecutor = MoreExecutors.listeningDecorator(userExecutor); } ListeningExecutorService getListeningExecutor() { return listeningExecutor; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy