From 697d6277d2715b06e41abc790ab8b053df1520c7 Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Sun, 22 Oct 2006 20:28:22 +0000 Subject: Signal protocol --- .../net4j/util/concurrent/Asynchronizer.java | 25 ---- .../concurrent/AsynchronousWorkSerializer.java | 127 +++++++++++++++++++++ .../util/concurrent/SynchronousWorkSerializer.java | 36 ++++++ .../net4j/util/concurrent/WorkSerializer.java | 21 ++++ .../org/eclipse/net4j/util/concurrent/Worker.java | 25 ---- 5 files changed, 184 insertions(+), 50 deletions(-) delete mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java create mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java create mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java create mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java delete mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java (limited to 'plugins/org.eclipse.net4j/src/org/eclipse/net4j/util') 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/Asynchronizer.java deleted file mode 100644 index 60840f0777..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java +++ /dev/null @@ -1,25 +0,0 @@ -/*************************************************************************** - * 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; - -/** - * @author Eike Stepper - */ -public class Asynchronizer -{ - public Asynchronizer() - { - } - - public void addWork(Runnable work) - { - } -} 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 workQueue; + + private Occupation occupation = new Occupation(); + + public AsynchronousWorkSerializer(ExecutorService executorService, Queue 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}. + *

+ */ + 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/SynchronousWorkSerializer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java new file mode 100644 index 0000000000..d727aaf974 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java @@ -0,0 +1,36 @@ +/*************************************************************************** + * 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; + +/** + * @author Eike Stepper + */ +public class SynchronousWorkSerializer implements WorkSerializer +{ + 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/WorkSerializer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java new file mode 100644 index 0000000000..4539855c14 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java @@ -0,0 +1,21 @@ +/*************************************************************************** + * 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; + +/** + * @author Eike Stepper + */ +public interface WorkSerializer +{ + public void addWork(Runnable work); + + public void dispose(); +} 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/Worker.java deleted file mode 100644 index 0a1d268b18..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java +++ /dev/null @@ -1,25 +0,0 @@ -/*************************************************************************** - * 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; - -/** - * @author Eike Stepper - */ -public class Worker -{ - public Worker() - { - } - - public void addWork(Runnable work) - { - } -} -- cgit v1.2.3