001: package net.sourceforge.squirrel_sql.fw.util;
002:
003: /*
004: * Copyright (C) 2001 Johan Companger
005: * jcompagner@j-com.nl
006: *
007: * Modification copyright (C) 2001 Colin Bell
008: * colbell@users.sourceforge.net
009: *
010: * This library is free software; you can redistribute it and/or
011: * modify it under the terms of the GNU Lesser General Public
012: * License as published by the Free Software Foundation; either
013: * version 2.1 of the License, or (at your option) any later version.
014: *
015: * This library is distributed in the hope that it will be useful,
016: * but WITHOUT ANY WARRANTY; without even the implied warranty of
017: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
018: * Lesser General Public License for more details.
019: *
020: * You should have received a copy of the GNU Lesser General Public
021: * License along with this library; if not, write to the Free Software
022: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
023: */
024: import java.util.ArrayList;
025: import java.util.List;
026:
027: import javax.swing.JFrame;
028: import javax.swing.JOptionPane;
029: import javax.swing.SwingUtilities;
030:
031: import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
032: import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
033:
034: public class TaskThreadPool {
035: /** Logger for this class. */
036: private static ILogger s_log = LoggerController
037: .createLogger(TaskThreadPool.class);
038:
039: /** Internationalized strings for this class. */
040: private static final StringManager s_stringMgr = StringManagerFactory
041: .getStringManager(TaskThreadPool.class);
042:
043: // Count of available or free threads.
044: private int _iFree;
045:
046: // Total number of threads.
047: private int _threadCount;
048:
049: private List<Runnable> _tasks = new ArrayList<Runnable>();
050:
051: private MyCallback _callback = new MyCallback();
052: private JFrame _parentForMessages = null;
053:
054: /**
055: * Add a task to be executed by the next available thread
056: * in this thread pool. If there is no free thread available
057: * but the maximum number of threads hasn't been reached then
058: * create a new thread.
059: */
060: public synchronized void addTask(Runnable task)
061: throws IllegalArgumentException {
062: if (task == null) {
063: throw new IllegalArgumentException("Null Runnable passed");
064: }
065: _tasks.add(task);
066: // Should there me a Max Number of threads?
067: if (_iFree == 0) {
068: Thread th = new Thread(new TaskExecuter(_callback));
069: th.setPriority(Thread.MIN_PRIORITY); //??
070: th.setDaemon(true);
071: th.start();
072: ++_threadCount;
073: s_log.debug("Creating thread nbr: " + _threadCount);
074: } else {
075: synchronized (_callback) {
076: s_log.debug("Reusing existing thread");
077: _callback.notify();
078: }
079: }
080: }
081:
082: public void setParentForMessages(JFrame parentForMessages) {
083: _parentForMessages = parentForMessages;
084: }
085:
086: private final class MyCallback implements ITaskThreadPoolCallback {
087: public void incrementFreeThreadCount() {
088: ++_iFree;
089: s_log.debug("Returning thread. " + _iFree
090: + " threads available");
091: }
092:
093: public void decrementFreeThreadCount() {
094: --_iFree;
095: s_log.debug("Using a thread. " + _iFree
096: + " threads available");
097: }
098:
099: public synchronized Runnable nextTask() {
100: if (_tasks.size() > 0) {
101: return _tasks.remove(0);
102: }
103: return null;
104: }
105:
106: public void showMessage(final Throwable th) {
107: s_log.error("Error", th);
108: SwingUtilities.invokeLater(new Runnable() {
109: public void run() {
110: //i18n[TaskThreadPool.errorDuringTaskExecMsg=Error ocured during task execution:]
111: StringBuffer msg = new StringBuffer(
112: s_stringMgr
113: .getString("TaskThreadPool.errorDuringTaskExecMsg"));
114: msg.append("\n");
115: msg.append(th.getMessage());
116: JOptionPane.showMessageDialog(_parentForMessages,
117: msg.toString());
118: throw new RuntimeException(th);
119: }
120: });
121: }
122: }
123: }
|