diff options
author | Eike Stepper | 2006-10-22 20:28:22 +0000 |
---|---|---|
committer | Eike Stepper | 2006-10-22 20:28:22 +0000 |
commit | 697d6277d2715b06e41abc790ab8b053df1520c7 (patch) | |
tree | 42cf443c1076c70add0e3e10a4658097f4bff574 /plugins/org.eclipse.net4j/src/org/eclipse/net4j/util | |
parent | d2b31d4e130e492fe6a7581612a85d35659ef4b3 (diff) | |
download | cdo-697d6277d2715b06e41abc790ab8b053df1520c7.tar.gz cdo-697d6277d2715b06e41abc790ab8b053df1520c7.tar.xz cdo-697d6277d2715b06e41abc790ab8b053df1520c7.zip |
Signal protocol
Diffstat (limited to 'plugins/org.eclipse.net4j/src/org/eclipse/net4j/util')
-rw-r--r-- | plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java | 127 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java (renamed from plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java) | 15 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java (renamed from plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java) | 10 |
3 files changed, 143 insertions, 9 deletions
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java new file mode 100644 index 0000000000..479b58a64a --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java @@ -0,0 +1,127 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.concurrent; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; + +/** + * @author Eike Stepper + */ +public class AsynchronousWorkSerializer implements WorkSerializer, Runnable +{ + private ExecutorService executorService; + + private Queue<Runnable> workQueue; + + private Occupation occupation = new Occupation(); + + public AsynchronousWorkSerializer(ExecutorService executorService, Queue<Runnable> workQueue) + { + if (executorService == null) + { + throw new IllegalArgumentException("executorService == null"); + } + + this.executorService = executorService; + this.workQueue = workQueue; + } + + public AsynchronousWorkSerializer(ExecutorService executorService) + { + this(executorService, new ConcurrentLinkedQueue()); + } + + public ExecutorService getExecutorService() + { + return executorService; + } + + public void addWork(Runnable work) + { + workQueue.add(work); + + // isOccupied can (and must) be called unsynchronized here + if (!occupation.isOccupied()) + { + synchronized (occupation) + { + occupation.setOccupied(true); + } + + System.out.println(toString() + ": Notifying executor service"); + executorService.execute(this); + } + } + + /** + * Executed in the context of the + * {@link #getExecutorService() executor service}. + * <p> + */ + public void run() + { + synchronized (occupation) + { + Runnable work; + while (occupation.isOccupied() && (work = workQueue.poll()) != null) + { + try + { + work.run(); + } + catch (RuntimeException ex) + { + ex.printStackTrace(); + } + } + + occupation.setOccupied(false); + } + } + + public void dispose() + { + if (occupation.isOccupied()) + { + occupation.setOccupied(false); + } + + workQueue.clear(); + workQueue = null; + executorService = null; + } + + @Override + public String toString() + { + return "AsynchronousWorkSerializer[" + executorService + "]"; + } + + /** + * @author Eike Stepper + */ + private static class Occupation + { + private boolean occupied = false; + + public boolean isOccupied() + { + return occupied; + } + + public void setOccupied(boolean occupied) + { + this.occupied = occupied; + } + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java index 60840f0777..d727aaf974 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java @@ -13,13 +13,24 @@ package org.eclipse.net4j.util.concurrent; /** * @author Eike Stepper */ -public class Asynchronizer +public class SynchronousWorkSerializer implements WorkSerializer { - public Asynchronizer() + public SynchronousWorkSerializer() { } public void addWork(Runnable work) { + work.run(); + } + + public void dispose() + { + } + + @Override + public String toString() + { + return "SynchronousWorkSerializer"; } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java index 0a1d268b18..4539855c14 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java @@ -13,13 +13,9 @@ package org.eclipse.net4j.util.concurrent; /** * @author Eike Stepper */ -public class Worker +public interface WorkSerializer { - public Worker() - { - } + public void addWork(Runnable work); - public void addWork(Runnable work) - { - } + public void dispose(); } |