Copyright (c) 2011-2016 Igor Fedorenko This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: Igor Fedorenko - initial API and implementation
/******************************************************************************* * Copyright (c) 2011-2016 Igor Fedorenko * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * Igor Fedorenko - initial API and implementation *******************************************************************************/
package org.eclipse.jdt.internal.launching.sourcelookup.advanced; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.internal.launching.LaunchingPlugin;
Simple background request processing queue implemented using Job API. Requests are executed in the order they arrive. Request execution delayed by 1000 milliseconds and all requests submitted during this period will be processed together.
/** * Simple background request processing queue implemented using {@link Job} API. Requests are executed in the order they arrive. Request execution * delayed by {@value #EXECUTION_DELAY} milliseconds and all requests submitted during this period will be processed together. */
public class BackgroundProcessingJob extends Job { private static final long EXECUTION_DELAY = 1000L; private final ArrayList<IRunnableWithProgress> queue = new ArrayList<>(); public BackgroundProcessingJob() { super(Messages.BackgroundProcessingJob_name); } @Override protected IStatus run(IProgressMonitor monitor) { ArrayList<IRunnableWithProgress> tasks; synchronized (this.queue) { tasks = new ArrayList<>(this.queue); this.queue.clear(); } SubMonitor progress = SubMonitor.convert(monitor, tasks.size()); List<IStatus> errors = new ArrayList<>(); for (IRunnableWithProgress task : tasks) { try { task.run(progress.split(1)); } catch (CoreException e) { errors.add(e.getStatus()); } } if (errors.isEmpty()) { return Status.OK_STATUS; } if (errors.size() == 1) { return errors.get(0); } return new MultiStatus(LaunchingPlugin.ID_PLUGIN, IStatus.ERROR, errors.toArray(new IStatus[errors.size()]), Messages.BackgroundProcessingJob_failed, null); } public void schedule(IRunnableWithProgress task) { synchronized (queue) { queue.add(task); schedule(EXECUTION_DELAY); } } }