On Mon, Feb 12, 2001 at 04:33:46PM -0500, Gianni Johansson wrote:
> On Monday 12 February 2001 14:15, Scott wrote:
>
> > > On Mon, Feb 12, 2001 at 01:29:15PM -0500, Gianni Johansson wrote:
> > > Also, it looks like ThreadPool.runningThreads() should just be:
> > >
> > > private int runningThreads() {
> > > return poolGroup.activeCount();
> > > }
> >
> > No, because pooled threads are technically active, but arent hosting any
> > actual job.
> The problem is that you preallocate the Ethreads. They don't have
> java.lang.Threads associated with them until they run their first job.
> i.e. until EThread.begin() is called. This is what is messing up your
> counting.
At any rate thats fixed.
>
> I don't get what you mean by "technically active". What matters, besides the
> number of real java.lang.Thread objects???
Do you understand what thread pooling is? It means that there can be a
few Thread objects technically running, but they are actually just being
held on to waiting for a new job to run. At that point, we give it a
Runnable and the EThread continues, running the new job.
>
> Also, using activeCount at all seems suspect. because it is approximate:
> http://www.javasoft.com/products/jdk/1.2/docs/api/java/lang/ThreadGroup.html#activeCount()
>
> Why not just use a counter that's incremented when jobs are dequeued and
> run in ThreadPool.run() and decremented in ThreadPool.reclaim() ?
Because a Thread may die unexpectedly and kill our count. Its better to
have a moderately inaccurate count than one that can become wildly
inaccurate.
> > had to be a bit more extensive, since it affected the interface as well.
> >
> > Scott
>
> I applied the patch and retested. This is still not right.
>
> Uncomment the printlns in ThreadPool.run and ThreadPool.blockingRun
> and test.
>
> You will see negative values for runningThreads() in the output.
>
> Also it looks like EThread.run() never exits. How do you shutdown cleanly?
There are some serious sync issues between experimental and stable. The
EThread in stable has the correct behavior:
for (;;) {
while (code == null) {
synchronized(this) {
try {
wait();
} catch (InterruptedException ie) {}
}
}
if (code instanceof ERunnable)
((ERunnable)code).setExecutionInstance(this);
try {
code.run();
} catch (Throwable t) {
} finally {
code=null;
if (!host.reclaim(this))
return;
}
}
-------------- 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/0ca1dc39/attachment.pgp>