App
WorkingTask.java
Go to the documentation of this file.
1 package mhr.appcore.tasks;
2 
3 import java.util.LinkedList;
4 
5 import mhr.appcore.AppCore;
6 import mhr.appcore.commands.AppCommand;
7 import mhr.appcore.exceptions.AppNonFatalException;
8 import mhr.appcore.interfaces.PDExceptionFeedback;
9 
13 public class WorkingTask implements Runnable {
14 
15  //===== INTERFACES, CLASSES, ENUMS ==========================================================================================================//
16  //----- NON-PUBLIC --------------------------------------------------------------------------------------------------------------------------//
20  private class Lock {
21  public volatile boolean EXIT_FLAG = false;
22  public volatile boolean EXCEPTION_PENDING_FLAG = false;
23  public LinkedList<AppCommand> commands = new LinkedList<AppCommand>();
24  }
25 
26  //----- PUBLIC ------------------------------------------------------------------------------------------------------------------------------//
27 
28  //===== FIELDS ==============================================================================================================================//
29  //----- NON-PUBLIC --------------------------------------------------------------------------------------------------------------------------//
30  protected AppCore app;
31  protected Thread thread;
32  protected Lock lock = new Lock();
33  protected Thread.UncaughtExceptionHandler handler = null;
34 
35  //----- PUBLIC ------------------------------------------------------------------------------------------------------------------------------//
36 
37  //===== CONSTRUCTORS, DESTRUCTORS, RELATED METHODS ==========================================================================================//
38  //----- NON-PUBLIC --------------------------------------------------------------------------------------------------------------------------//
39  //----- PUBLIC ------------------------------------------------------------------------------------------------------------------------------//
45  public WorkingTask(AppCore app) throws NullPointerException {
46  if (app == null) {
47  throw new NullPointerException("app should not be null");
48  }
49  this.app = app;
50  }
51 
52  public void setThreadEH(Thread.UncaughtExceptionHandler handler) {
53  synchronized (lock) {
54  this.handler = handler;
55  if (thread != null) {
56  thread.setUncaughtExceptionHandler(handler);
57  }
58  }
59  }
60 
61 
62  public synchronized void dispose() {
63  stop();
65  }
66  //===== METHODS =============================================================================================================================//
67 
68  //----- NON-PUBLIC --------------------------------------------------------------------------------------------------------------------------//
69  //----- PUBLIC ------------------------------------------------------------------------------------------------------------------------------//
74  public boolean isRunning() {
75  if (thread != null) {
76  return true;
77  } else {
78  return false;
79  }
80  }
81 
85  public void clearCommandQueue() {
86  synchronized (lock) {
87  AppCommand c;
88  while ((c = lock.commands.pollFirst()) != null) {
89  c.dispose();
90  }
91  }
92  }
93 
97  public synchronized void start() {
98  if (thread != null) {
99  return;
100  }
101  thread = new Thread(this);
102  if (handler != null) {
103  thread.setUncaughtExceptionHandler(handler);
104  }
105  synchronized (lock) { // Tohle by nemělo být zapotřebí....
106  lock.EXIT_FLAG = false;
107  }
108  thread.start();
109  }
110 
114  public synchronized void stop() {
115  if (thread == null) {
116  return;
117  }
118  synchronized (lock) {
119  lock.EXIT_FLAG = true;
120  lock.notifyAll();
121  }
122  try {
123  thread.join();
124  } catch (InterruptedException exc) {
125  }
126  thread = null;
127  }
128 
133  public void addCommand(AppCommand command) {
134  synchronized (lock) {
136  lock.commands.add(command);
137  } else {
138  command.dispose();
139  }
140  lock.notifyAll();
141  }
142  }
143 
147  public void unsetExceptionFlag() {
148  synchronized (lock) {
150  lock.notifyAll();
151  }
152  }
153 
154  //===== CALLBACKS ===========================================================================================================================//
155 
156  @Override
157  public void run() {
158  AppCommand cmd = null;
159  while (true) { // bezi stale
160  synchronized (lock) {
161  while (true) {
162  if (lock.EXIT_FLAG) {
163  return;
164  }
165  cmd = this.lock.commands.poll();
166  if (cmd != null) {
167  break; // vyskočíme a zpracovavame
168  }
169  try {
170  this.lock.wait();
171  } catch (InterruptedException e) {
172  return;
173  }
174  }
175  }
176  try {
177  cmd.execute(app);
178  } catch (AppNonFatalException e) {
180  if (f != null) {
181  synchronized (lock) {
183  AppCommand c;
184  while ((c = lock.commands.pollFirst()) != null) {
185  c.dispose();
186  }
187  lock.notifyAll();
188  }
189  f.feedback(e);
190  } else {
191  throw e;
192  }
193  }
194  }
195  }
196 }