001: /*
002: ItsNat Java Web Application Framework
003: Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
004: Author: Jose Maria Arranz Santamaria
005:
006: This program is free software: you can redistribute it and/or modify
007: it under the terms of the GNU Affero General Public License as published by
008: the Free Software Foundation, either version 3 of the License, or
009: (at your option) any later version. See the GNU Affero General Public
010: License for more details. See the copy of the GNU Affero General Public License
011: included in this program. If not, see <http://www.gnu.org/licenses/>.
012: */
013:
014: package org.itsnat.impl.core.listener;
015:
016: import org.itsnat.core.ItsNatException;
017: import org.itsnat.impl.core.ItsNatDocumentImpl;
018: import org.itsnat.impl.core.event.client2serv.*;
019:
020: /**
021: *
022: * @author jmarranz
023: */
024: public class AsyncTask extends GenericTask implements Runnable {
025: protected boolean lockDoc;
026: protected long maxWait;
027: protected Thread thread;
028: protected boolean started = false;
029: protected Runnable task;
030: protected ItsNatDocumentImpl itsNatDoc;
031:
032: /**
033: * Creates a new instance of AsyncTask
034: */
035: public AsyncTask(Runnable task, boolean lockDoc, long maxWait,
036: ItsNatDocumentImpl itsNatDoc) {
037: if (task instanceof Thread)
038: throw new ItsNatException(
039: "Runnable object must not be a Thread");
040:
041: this .task = task;
042:
043: this .lockDoc = lockDoc;
044: this .maxWait = maxWait;
045:
046: this .itsNatDoc = itsNatDoc;
047:
048: this .thread = new Thread(this );
049: }
050:
051: public void dispose() {
052: this .thread = null;
053: }
054:
055: public ItsNatDocumentImpl getItsNatDocument() {
056: return itsNatDoc;
057: }
058:
059: public boolean isStarted() {
060: return started;
061: }
062:
063: public Runnable getTask() {
064: return task;
065: }
066:
067: public boolean locksDocument() {
068: return lockDoc;
069: }
070:
071: public void start() {
072: thread.start();
073:
074: if (!started) {
075: // Para asegurarnos de que ha empezado pues podrķa darse la paradoja de
076: // que el evento que recoje los resultados llegara antes de que empiece el hilo que tiene que hacerlos
077: Thread currentThread = Thread.currentThread();
078: while (!started)
079: currentThread.yield();
080: }
081: }
082:
083: public boolean isAlive() {
084: Thread thread = this .thread;
085: if (thread == null)
086: return false;
087: return thread.isAlive();
088: }
089:
090: public void run() {
091: this .started = true;
092:
093: Runnable task = getTask();
094: if (lockDoc) {
095: ItsNatDocumentImpl itsNatDoc = getItsNatDocument();
096: synchronized (itsNatDoc) {
097: task.run();
098: }
099: } else
100: task.run();
101: }
102:
103: public Thread getThread() {
104: return thread;
105: }
106:
107: public void waitToFinish() {
108: Thread thread = this .thread;
109: if (thread == null)
110: return;
111:
112: // Para que espere tranquilito (parado) dando oportunidad a otros hilos
113: try {
114: thread.join(maxWait);
115: } catch (InterruptedException ex) {
116: }
117: }
118: }
|