1 43 package net.jforum.util.concurrent.executor; 44 45 import net.jforum.util.concurrent.Executor; 46 import net.jforum.util.concurrent.Queue; 47 import net.jforum.util.concurrent.Result; 48 import net.jforum.util.concurrent.Task; 49 import net.jforum.util.concurrent.queue.UnboundedFifoQueue; 50 import net.jforum.util.preferences.ConfigKeys; 51 import net.jforum.util.preferences.SystemGlobals; 52 53 import org.apache.log4j.Logger; 54 55 59 public class QueuedExecutor implements Executor 60 { 61 private Thread currentThread; 62 private final Queue queue; 63 private final Object lock = new Object (); 64 private static final Logger logger = Logger.getLogger(QueuedExecutor.class); 65 66 private static QueuedExecutor instance = new QueuedExecutor(new UnboundedFifoQueue()); 67 68 private QueuedExecutor(Queue queue) 69 { 70 logger.info("Setting queue..."); 71 this.queue = queue; 72 } 73 74 public static QueuedExecutor getInstance() 75 { 76 return instance; 77 } 78 79 private class WorkerThread extends AbstractWorker 80 { 81 protected Object take() throws InterruptedException 82 { 83 return queue.get(); 84 } 85 86 protected void cleanup() 87 { 88 synchronized(lock) { 89 currentThread = null; 90 logger.info("Cleaning up the thread..."); 91 } 92 } 93 } 94 95 public void execute(Task task) throws InterruptedException 96 { 97 if (SystemGlobals.getBoolValue(ConfigKeys.BACKGROUND_TASKS)) { 98 queue.put(task); 99 synchronized(lock) { 100 if(currentThread == null) { 101 logger.info("Creating a new thread..."); 102 103 currentThread = new Thread (new WorkerThread(), "jforum"); 104 currentThread.setDaemon(true); 105 currentThread.start(); 106 } 107 } 108 } 109 else { 110 try { 111 task.execute(); 112 } 113 catch (Exception e) { 114 logger.warn("Error while executing a task: " + e); 115 } 116 } 117 } 118 119 public Result executeWithResult(Task task) throws InterruptedException 120 { 121 SimpleResult result = new SimpleResult(task); 122 queue.put(result); 123 124 synchronized(lock) { 125 if(currentThread == null) { 126 currentThread = new Thread (new WorkerThread(), "jforum"); 127 currentThread.setDaemon(true); 128 currentThread.setName(this.getClass().getName() + "Thread"); 129 130 currentThread.start(); 131 } 132 } 133 134 return result; 135 } 136 } 137 | Popular Tags |