Android Open Source - getrest Worker Queue






From Project

Back to project page getrest.

License

The source code is released under:

Apache License

If you think the Android project getrest listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright 2012 Alexey Hanin//from  w w w  . j  ava  2 s .  co m
 *
 * 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 getrest.android.util;

import java.util.HashSet;
import java.util.Queue;
import java.util.Set;

/**
 * Implements worker queue.
 *
 * @param <T>
 */
public class WorkerQueue<T> {

    private final Queue<T> queue;

    private final Worker<T> worker;

    private final Set<Thread> threads;

    private int maxThreads;

    private int busyWorkers;

    private Runnable workerRunnable;

    private boolean isRunning;
    private boolean isStopping;

    public interface Worker<T> {
        void execute(T item);
    }

    public WorkerQueue(Queue<T> queue, Worker<T> worker, int maxThreads) {
        this.queue = queue;
        this.worker = worker;
        this.maxThreads = maxThreads;
        this.threads = new HashSet<Thread>(maxThreads);
    }

    public Queue<T> getQueue() {
        return queue;
    }

    public void add(T item) {
        synchronized (queue) {
            queue.add(item);
            queue.notifyAll();

            reviseWorkerThreads();
        }
    }

    private void reviseWorkerThreads() {
        synchronized (this) {
            if (isRunning && queue.size() > threads.size() - busyWorkers && threads.size() < maxThreads) {
                final Thread thread = new Thread(getWorkerRunnable());
                threads.add(thread);
                thread.start();
            }
        }
    }

    private Runnable getWorkerRunnable() {
        if (workerRunnable == null) {
            synchronized (this) {
                workerRunnable = new WorkerRunnable();
            }
        }
        return workerRunnable;
    }

    public void start() {
        synchronized (this) {
            if (isRunning || isStopping) {
                throw new IllegalStateException("Worker is either already running or is stopping");
            }

            isRunning = true;

            reviseWorkerThreads();

            synchronized (queue) {
                queue.notifyAll();
            }
        }
    }

    public void stop() {
        synchronized (this) {
            if (!isRunning || isStopping) {
                throw new IllegalStateException("Worker is either not running or is stopping");
            }
            isStopping = true;
            queue.notifyAll();
        }
    }

    private class WorkerRunnable implements Runnable {
        public void run() {
            while (isRunning && !isStopping) {
                synchronized (queue) {
                    while (queue.isEmpty() && isRunning && !isStopping) {
                        try {
                            queue.wait();
                        } catch (InterruptedException e) {
                            // TODO log exception
                        }
                    }

                    if (isRunning && !isStopping) {

                        beginWork();

                        final T item = queue.poll();
                        try {
                            worker.execute(item);
                        } catch (RuntimeException ex) {
                            // TODO log exception
                        }

                        endWork();

                    }
                }
            }
        }
    }

    private void endWork() {
        synchronized (this) {
            busyWorkers--;
            if (busyWorkers == 0 && isStopping) {
                isRunning = false;
                isStopping = false;
            }
        }
    }

    private void beginWork() {
        synchronized (this) {
            busyWorkers++;
        }
    }

}




Java Source Code List

getrest.android.RestfulClient.java
getrest.android.client.InMemoryRequestManager.java
getrest.android.client.RequestCallbackFactory.java
getrest.android.client.RequestCallback.java
getrest.android.client.RequestExecutor.java
getrest.android.client.RequestFuture.java
getrest.android.client.RequestRegistry.java
getrest.android.client.impl.RequestEventRecord.java
getrest.android.client.impl.RequestFutureImpl.java
getrest.android.client.impl.RequestRegistryEditorImpl.java
getrest.android.client.impl.RequestRegistryEntryFactory.java
getrest.android.client.impl.RequestRegistryPreferencesImpl.java
getrest.android.client.impl.RestfulClientImpl.java
getrest.android.client.impl.TransactionalRequestEntryStorage.java
getrest.android.config.ConfigResolver.java
getrest.android.config.Config.java
getrest.android.config.DefaultContributor.java
getrest.android.config.HasConfig.java
getrest.android.config.ResourceContextContribution.java
getrest.android.config.ResourceContextContributor.java
getrest.android.config.ResourceNode.java
getrest.android.config.ResourcePath.java
getrest.android.core.BaseRequest.java
getrest.android.core.ErrorState.java
getrest.android.core.Error.java
getrest.android.core.HandlerException.java
getrest.android.core.HasHeaders.java
getrest.android.core.Header.java
getrest.android.core.HeadersHelper.java
getrest.android.core.Headers.java
getrest.android.core.Method.java
getrest.android.core.Pack.java
getrest.android.core.Request.java
getrest.android.core.Response.java
getrest.android.core.Status.java
getrest.android.exception.GetrestException.java
getrest.android.exception.GetrestRuntimeException.java
getrest.android.executor.Handler.java
getrest.android.executor.PostMethodPipeline.java
getrest.android.executor.RequestHandlerFactory.java
getrest.android.executor.RequestHandlerImpl.java
getrest.android.executor.RequestHandler.java
getrest.android.executor.RequestPipeline.java
getrest.android.http.HttpEntityRepresentation.java
getrest.android.http.HttpServiceRequestExecutor.java
getrest.android.http.RepresentationHttpEntity.java
getrest.android.request.RequestContext.java
getrest.android.request.RequestLifecycle.java
getrest.android.request.RequestManager.java
getrest.android.request.RequestStatus.java
getrest.android.resource.Marshaller.java
getrest.android.resource.Packer.java
getrest.android.resource.ResourceContextImpl.java
getrest.android.resource.ResourceContext.java
getrest.android.service.Broadcaster.java
getrest.android.service.Representation.java
getrest.android.service.RequestEventBus.java
getrest.android.service.RequestJob.java
getrest.android.service.RequestStateChangeEventWrapper.java
getrest.android.service.RequestWrapper.java
getrest.android.service.RestService.java
getrest.android.service.ServiceRequestExecutor.java
getrest.android.service.ServiceRequest.java
getrest.android.service.ServiceResponse.java
getrest.android.testapp.GetrestTestApplication.java
getrest.android.testapp.MainActivity.java
getrest.android.util.LoggerFactory.java
getrest.android.util.Logger.java
getrest.android.util.WorkerQueue.java