Java tutorial
/* * Copyright 2011 mercatis Technologies AG * * 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.mercatis.lighthouse3.ui.environment.base.adapters; import java.lang.reflect.InvocationTargetException; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; public abstract class RunnableWithProgressAndFuture<V> implements IRunnableWithProgress { private final ReentrantLock lock = new ReentrantLock(); private final Condition completeCondition = lock.newCondition(); private boolean completed = false; private V future; public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { lock.lock(); try { runWithFuture(monitor); completed = true; completeCondition.signal(); } finally { lock.unlock(); } } public abstract void runWithFuture(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException; /** * Returns the future (Blocking). * * @return the Future * @throws InterruptedException */ public V get() throws InterruptedException { lock.lock(); try { while (!completed) { completeCondition.await(); } return future; } finally { lock.unlock(); } } protected void set(V result) { this.future = result; } }