Javolution 6.0.0 java
ConcurrentContextImpl.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.context.internal;
10 
12 import javolution.lang.MathLib;
13 
17 public final class ConcurrentContextImpl extends ConcurrentContext {
18 
19  private int completedCount; // Nbr of concurrent task completed.
20  private Throwable error; // Any error raised.
21 
22  private int initiatedCount; // Nbr of concurrent task initiated.
25 
30  this.parent = null;
31  int nbThreads = ConcurrentContext.CONCURRENCY.get();
32  threads = new ConcurrentThreadImpl[nbThreads];
33  for (int i = 0; i < nbThreads; i++) {
34  threads[i] = new ConcurrentThreadImpl();
35  threads[i].start();
36  }
37  }
38 
43  this.parent = parent;
44  this.threads = parent.threads; // Inherit threads from parents.
45  }
46 
47  // Informs this context of the completion of a task (with possible error).
48  public synchronized void completed(Throwable error) {
49  if (error != null) {
50  this.error = error;
51  }
53  this.notify();
54  }
55 
56  @Override
57  public void execute(Runnable logic) {
58  // Find a thread not busy.
59  for (ConcurrentThreadImpl thread : threads) {
60  if (thread.execute(logic, this)) {
62  return;
63  }
64  }
65  // Executes by current thread.
66  try {
67  logic.run();
68  } catch (Throwable e) {
69  error = e;
70  }
71  }
72 
73  @Override
74  public synchronized void exit() {
75  super.exit();
76  try {
77  while (initiatedCount != completedCount) {
78  this.wait();
79  }
80  } catch (InterruptedException ex) {
81  this.error = ex;
82  }
83  if (error == null)
84  return; // Everything fine.
85  if (error instanceof RuntimeException)
86  throw (RuntimeException) error;
87  if (error instanceof Error)
88  throw (Error) error;
89  throw new RuntimeException(error);
90  }
91 
92  @Override
93  public int getConcurrency() {
94  return threads.length;
95  }
96 
97  @Override
98  public void setConcurrency(int concurrency) {
99  // The setting of the concurrency can only reduce the number
100  // of threads available in the context.
101  int nbThreads = MathLib.min(parent.threads.length, concurrency);
102  threads = new ConcurrentThreadImpl[nbThreads];
103  for (int i = 0; i < nbThreads; i++) { // Reused from parent threads.
104  threads[i] = parent.threads[i];
105  }
106  }
107 
108  @Override
109  protected ConcurrentContext inner() {
110  return new ConcurrentContextImpl(this);
111  }
112 
113 }
javolution.context.internal.ConcurrentContextImpl.ConcurrentContextImpl
ConcurrentContextImpl()
Definition: ConcurrentContextImpl.java:29
javolution
javolution.context.internal.ConcurrentContextImpl
Definition: ConcurrentContextImpl.java:17
javolution.context
Definition: AbstractContext.java:9
javolution.lang.MathLib
Definition: MathLib.java:20
javolution.context.internal.ConcurrentContextImpl.completedCount
int completedCount
Definition: ConcurrentContextImpl.java:19
javolution.context.internal.ConcurrentContextImpl.threads
ConcurrentThreadImpl[] threads
Definition: ConcurrentContextImpl.java:24
javolution.context.internal.ConcurrentContextImpl.error
Throwable error
Definition: ConcurrentContextImpl.java:20
javolution.context.internal.ConcurrentContextImpl.inner
ConcurrentContext inner()
Definition: ConcurrentContextImpl.java:109
javolution.context.internal.ConcurrentContextImpl.ConcurrentContextImpl
ConcurrentContextImpl(ConcurrentContextImpl parent)
Definition: ConcurrentContextImpl.java:42
javolution.context.internal.ConcurrentContextImpl.getConcurrency
int getConcurrency()
Definition: ConcurrentContextImpl.java:93
javolution.context.internal.ConcurrentContextImpl.exit
synchronized void exit()
Definition: ConcurrentContextImpl.java:74
javolution.lang
Definition: Configurable.java:9
javolution.context.internal.ConcurrentContextImpl.setConcurrency
void setConcurrency(int concurrency)
Definition: ConcurrentContextImpl.java:98
javolution.context.ConcurrentContext
Definition: ConcurrentContext.java:151
javolution.context.ConcurrentContext.CONCURRENCY
static final Configurable< Integer > CONCURRENCY
Definition: ConcurrentContext.java:160
javolution.context.internal.ConcurrentContextImpl.initiatedCount
int initiatedCount
Definition: ConcurrentContextImpl.java:22
javolution.context.internal.ConcurrentContextImpl.execute
void execute(Runnable logic)
Definition: ConcurrentContextImpl.java:57
javolution.context.internal.ConcurrentContextImpl.completed
synchronized void completed(Throwable error)
Definition: ConcurrentContextImpl.java:48
javolution.context.internal.ConcurrentContextImpl.parent
final ConcurrentContextImpl parent
Definition: ConcurrentContextImpl.java:23
javolution.context.internal.ConcurrentThreadImpl
Definition: ConcurrentThreadImpl.java:20
javolution.lang.Configurable.get
T get()
Definition: Configurable.java:170
javolution.lang.MathLib.min
static int min(int x, int y)
Definition: MathLib.java:1010