001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package threaddemo.locking;
043:
044: import java.util.concurrent.Callable;
045: import java.util.concurrent.ExecutionException;
046: import java.util.concurrent.ExecutorService;
047: import java.util.concurrent.Executors;
048: import java.util.concurrent.Future;
049:
050: /**
051: * Worker thread (off-AWT) that can run tasks asynch.
052: * Convenience wrapper for {@link ExecutorService}.
053: * @author Jesse Glick
054: */
055: public final class Worker {
056:
057: private static final ExecutorService POOL = Executors
058: .newCachedThreadPool();
059:
060: private Worker() {
061: }
062:
063: /**
064: * Start a task.
065: * It will be run soon.
066: * At most one task will be run at a time.
067: */
068: public static void start(Runnable run) {
069: POOL.submit(run);
070: }
071:
072: /**
073: * Do something and wait for it to finish.
074: */
075: public static <T> T block(final LockAction<T> act) {
076: Future<T> f = POOL.submit(new Callable<T>() {
077: public T call() {
078: return act.run();
079: }
080: });
081: try {
082: return f.get();
083: } catch (ExecutionException e) {
084: Throwable t = e.getCause();
085: if (t instanceof Error) {
086: throw (Error) t;
087: } else {
088: throw (RuntimeException) t;
089: }
090: } catch (InterruptedException e) {
091: throw new AssertionError(e);
092: }
093: }
094:
095: /**
096: * Do something and wait for it to finish.
097: * May throw exceptions.
098: */
099: public static <T, E extends Exception> T block(
100: final LockExceptionAction<T, E> act) throws E {
101: Future<T> f = POOL.submit(new Callable<T>() {
102: public T call() throws Exception {
103: return act.run();
104: }
105: });
106: try {
107: return f.get();
108: } catch (ExecutionException e) {
109: Throwable t = e.getCause();
110: if (t instanceof Error) {
111: throw (Error) t;
112: } else if (t instanceof RuntimeException) {
113: throw (RuntimeException) t;
114: } else {
115: @SuppressWarnings("unchecked")
116: E _e = (E) e;
117: throw _e;
118: }
119: } catch (InterruptedException e) {
120: throw new AssertionError(e);
121: }
122: }
123:
124: }
|