On Mon, Feb 12, 2001 at 12:33:25PM -0500, Gianni Johansson wrote: > On Monday 12 February 2001 09:32, Scott wrote: > > > Yeah, that seems right. There should be a ThreadGroup containing the > > threads, and runningThreads should be the number of active threads in that > > group minus those in the thread pool. > > > > Attached is a patch. I've updated the experimental tree if someone can > > patch this against the stable tree. > > > > Scott > > Hi Scott: > This doesn't look quite right. How do the java.lang.Thread objects managed > by the ThreadPool ever get into the poolGroup ThreadGroup? > Ack.
> It looks like tg was omitted from the superclass constructor arguments > in ThreadPool.ThreadPool. > > See comments in code snippet below. > > -- gj > > /** > * Creates a ThreadPool with a fixed number of concurrently > * executable jobs. This also allocates a job queue, so that > * new jobs can be inserted in a non-blocking manner even if all > * maxThreads threads are occupied. This ThreadPool allows up to a > * total of maxJobs running and queued jobs. > * > * @param tg The ThreadGroup to use for the pool and all it's > * children. > * @param maxThreads The number of jobs that can be active at any > * one time. > * @param maxJobs The maximum total number of allowable jobs. {@link > * run run()} returns false to turn away additional jobs past this point. > */ > public ThreadPool(ThreadGroup tg, int maxPool, int maxThreads, > int maxJobs) { > super("ThreadPool"); > // ^--- LOOK HERE. > // Shouldn't this be: > // super(tg, "ThreadPool"); > // No, I decided *not* to make the ThreadPool thread part of the group of managed threads. But yeah, your right about the group thing. Here's the new patch, which had to be a bit more extensive, since it affected the interface as well. Scott -------------- next part -------------- Common subdirectories: Freenet-old/thread/CVS and Freenet/thread/CVS diff -ud Freenet-old/thread/EThread.java Freenet/thread/EThread.java --- Freenet-old/thread/EThread.java Tue Jan 16 00:34:19 2001 +++ Freenet/thread/EThread.java Mon Feb 12 14:10:31 2001 @@ -56,7 +56,7 @@ */ protected void begin() { if (executor==null){ - executor=new Thread(this); + executor=host.getThread(this); executor.start(); } synchronized (this) { @@ -102,8 +102,7 @@ } catch (Throwable t) { } finally { code=null; - if (!host.reclaim(this)) - return; + host.reclaim(this); } } } diff -ud Freenet-old/thread/ThreadManager.java Freenet/thread/ThreadManager.java --- Freenet-old/thread/ThreadManager.java Tue Jan 16 00:34:19 2001 +++ Freenet/thread/ThreadManager.java Mon Feb 12 14:10:00 2001 @@ -45,7 +45,7 @@ * * @param e The E-Thread to return. */ - public boolean reclaim(EThread e); + public void reclaim(EThread e); /** * Begins operation of this thread-manager. Should be called @@ -69,6 +69,8 @@ * be run). */ public void flush(); + + Thread getThread(Runnable r); } diff -ud Freenet-old/thread/ThreadPool.java Freenet/thread/ThreadPool.java --- Freenet-old/thread/ThreadPool.java Mon Feb 12 14:13:43 2001 +++ Freenet/thread/ThreadPool.java Mon Feb 12 14:10:12 2001 @@ -53,7 +53,8 @@ * Creates a ThreadPool with a fixed number of concurrently * executable jobs. This also allocates a job queue, so that * an unlimited number of new jobs can be inserted in a non-blocking - * manner even if all maxThreads threads are occupied. + * manner even if all + * maxThreads threads are occupied. * * @param tg The ThreadGroup to use for the pool and all it's * children. @@ -69,8 +70,8 @@ * Creates a ThreadPool with a fixed number of concurrently * executable jobs. This also allocates a job queue, so that * new jobs can be inserted in a non-blocking manner even if all - * maxThreads threads are occupied. This ThreadPool allows up to a - * total of maxJobs running and queued jobs. + * maxThreads threads are occupied. This ThreadPool allows up to a total of maxJobs + * running and queued jobs. * * @param maxThreads The number of jobs that can be active at any * one time. @@ -86,8 +87,8 @@ * Creates a ThreadPool with a fixed number of concurrently * executable jobs. This also allocates a job queue, so that * new jobs can be inserted in a non-blocking manner even if all - * maxThreads threads are occupied. This ThreadPool allows up to a - * total of maxJobs running and queued jobs. + * maxThreads threads are occupied. This ThreadPool allows up to a total of maxJobs + * running and queued jobs. * * @param tg The ThreadGroup to use for the pool and all it's * children. @@ -122,17 +123,12 @@ * * @param e The EThread to reclaim. */ - public boolean reclaim(EThread e) { - boolean rv=false; - if (maxThreads == 0 || threads.size()<maxPoolThreads) { - threads.push(e); - rv=true; - } - + public void reclaim(EThread e) { + if (maxThreads > 0 || threads.size()<maxPoolThreads) + threads.push(e); synchronized(threads) { threads.notifyAll(); } - return rv; } private int runningThreads() { @@ -193,6 +189,13 @@ public void halt() { run=false; interrupt(); + } + + /** + * Returns a Thread to host an EThread + */ + public Thread getThread(Runnable r) { + return new Thread(poolGroup, r); } /** -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 232 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20010212/b3e4ea2c/attachment.pgp>