Re: thread pool
This is a multi-part message in MIME format.
----------------7041480511460249908
Content-Type: text/plain; charset=iso-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
On 2014-07-22 21:14:49 +0000, Eric Sosman said:
On 7/22/2014 5:01 PM, Philipp Kraus wrote:
[... ugly double-spaced Googlejunk snipped ...]
My solution seems to be similar, but if I run your startThreads again
thet.start();
throws the InterruptedException directly, so I do
main()
{
Master x = new Master();
x.startThreads(5);
x.stopThreads();
x.startThreads(5); <= this does not work because the exception is thrown
}
Are you sure startThreads() is creating and starting brand-
new Threads each time it's called, not re-using old Threads?
To put it another way, are you sure stopThreads() actually stops
all the old Threads and waits for them to finish stopping (and
then clears its "running workers" list)?
IMHO I do this (m_runners is the threadgroup):
m_runners.interrupt();
try {
m_threadcounter.await();
} catch (InterruptedException l_exception) {
m_Logger.error(l_exception.getMessage());
}
m_threadcounter is the CountDownLatch which is initialize on the
startThreads with the number of threads and each thread
calls the countDown() method before the run is released
I cannot imagine how a newly-created Thread would find itself
in the interrupted state before anything interrupts it. Is there
some other part of your program that interrupts Threads when it
shouldn't?
I don't think so. The threads are stopped / started from the UI and I
use some external libraries.
I have build a short example under
https://github.com/flashpixx/threadtest which shows the problem (I use
Java 1.8).
I get
CSimulation@5cad8086 simulation is started with [5] threads
CWorker@18a5eea9 thread [9] starts working
CWorker@3d9bc497 thread [10] starts working
CWorker@7351b7d5 thread [11] starts working
CWorker@6605d308 thread [12] starts working
CWorker@6826907c thread [13] starts working
CWorker@6605d308 thread [12] stops working with current count down latch [3]
CWorker@18a5eea9 thread [9] stops working with current count down latch [3]
CWorker@7351b7d5 thread [11] stops working with current count down latch [2]
CSimulation@5cad8086 threads stopped
CWorker@3d9bc497 thread [10] stops working with current count down latch [0]
CWorker@6826907c thread [13] stops working with current count down latch [1]
CSimulation@5cad8086 simulation is stopped
CSimulation@5cad8086 simulation is started with [5] threads
CWorker@b7127ff thread [14] starts working
CWorker@6441c612 thread [15] starts working
CWorker@67d26a8e thread [16] starts working
CWorker@193fa958 thread [17] starts working
CWorker@3aa2722f thread [18] starts working
CWorker@6441c612 thread [15] stops working with current count down latch [3]
CWorker@193fa958 thread [17] stops working with current count down latch [1]
CWorker@3aa2722f thread [18] stops working with current count down latch [0]
CSimulation@5cad8086 threads stopped
CWorker@67d26a8e thread [16] stops working with current count down latch [3]
CSimulation@5cad8086 simulation is stopped
CWorker@b7127ff thread [14] stops working with current count down latch [0]
It seems, that the CountDownLatch does not work as expected. Any idea?
Phil
----------------7041480511460249908
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="1187.4">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 12.0px; line-height: 14.0px; font: 12.0px Helvetica; color: #011892}
p.p4 {margin: 0.0px 0.0px 0.0px 24.0px; font: 12.0px Helvetica; color: #008e00}
p.p5 {margin: 0.0px 0.0px 0.0px 24.0px; font: 12.0px Helvetica; color: #008e00; min-height: 14.0px}
p.p6 {margin: 0.0px 0.0px 0.0px 12.0px; font: 12.0px Helvetica; color: #011892; min-height: 14.0px}
p.p7 {margin: 0.0px 0.0px 0.0px 12.0px; font: 12.0px Helvetica; color: #011892}
p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica}
p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000; min-height: 14.0px}
p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000}
span.Apple-tab-span {white-space:pre}
</style>
</head>
<body>
<p class="p1">On 2014-07-22 21:14:49 +0000, Eric Sosman said:</p>
<p class="p2"><br></p>
<p class="p3">On 7/22/2014 5:01 PM, Philipp Kraus wrote:</p>
<p class="p4">[... ugly double-spaced Googlejunk snipped ...]</p>
<p class="p4">My solution seems to be similar, but if I run your startThreads again</p>
<p class="p4">thet.start();</p>
<p class="p5"><br></p>
<p class="p4">throws the InterruptedException directly, so I do</p>
<p class="p5"><br></p>
<p class="p4">main()</p>
<p class="p4">{</p>
<p class="p4">Master x = new Master();</p>
<p class="p5"><br></p>
<p class="p4">x.startThreads(5);</p>
<p class="p4">x.stopThreads();</p>
<p class="p4">x.startThreads(5); <= this does not work because the exception is thrown</p>
<p class="p4">}</p>
<p class="p6"><br></p>
<p class="p7"><span class="Apple-converted-space">?? ? </span>Are you sure startThreads() is creating and starting brand-</p>
<p class="p7">new Threads each time it's called, not re-using old Threads?</p>
<p class="p7">To put it another way, are you sure stopThreads() actually stops</p>
<p class="p7">all the old Threads and waits for them to finish stopping (and</p>
<p class="p7">then clears its "running workers" list)?</p>
<p class="p8"><br></p>
<p class="p9">IMHO I do this (m_runners is the threadgroup):</p>
<p class="p8"><br></p>
<p class="p9"><span class="Apple-converted-space">? ? ? ? </span>m_runners.interrupt();</p>
<p class="p9"><span class="Apple-converted-space">? ? ? ? </span>try {</p>
<p class="p8"><br></p>
<p class="p9"><span class="Apple-converted-space">? ? ? ? ? ? </span>m_threadcounter.await();</p>
<p class="p8"><br></p>
<p class="p9"><span class="Apple-converted-space">? ? ? ? </span>} catch (InterruptedException l_exception) {</p>
<p class="p9"><span class="Apple-converted-space">? ? ? ? ? ? </span>m_Logger.error(l_exception.getMessage());</p>
<p class="p9"><span class="Apple-converted-space">? ? ? ? </span>}</p>
<p class="p8"><br></p>
<p class="p9">m_threadcounter is the CountDownLatch which is initialize on the startThreads with the number of threads and each thread</p>
<p class="p9">calls the countDown() method before the run is released</p>
<p class="p8"><br></p>
<p class="p7"><span class="Apple-converted-space">?? ? </span>I cannot imagine how a newly-created Thread would find itself</p>
<p class="p7">in the interrupted state before anything interrupts it.<span class="Apple-converted-space">? </span>Is there</p>
<p class="p7">some other part of your program that interrupts Threads when it</p>
<p class="p7">shouldn't?</p>
<p class="p10"><br></p>
<p class="p11">I don't think so. The threads are stopped / started from the UI and I use some external libraries.</p>
<p class="p8"><br></p>
<p class="p9">I have build a short example under <a href="https://github.com/flashpixx/threadtest">https://github.com/flashpixx/threadtest</a> which shows the problem (I use Java 1.8).</p>
<p class="p9">I get<span class="Apple-converted-space">?</span></p>
<p class="p9">CSimulation@5cad8086<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>simulation is started with [5] threads</p>
<p class="p9">CWorker@18a5eea9<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [9] starts working</p>
<p class="p9">CWorker@3d9bc497<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [10] starts working</p>
<p class="p9">CWorker@7351b7d5<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [11] starts working</p>
<p class="p9">CWorker@6605d308<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [12] starts working</p>
<p class="p9">CWorker@6826907c<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [13] starts working</p>
<p class="p8"><br></p>
<p class="p9">CWorker@6605d308<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [12] stops working with current count down latch [3]</p>
<p class="p9">CWorker@18a5eea9<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [9] stops working with current count down latch [3]</p>
<p class="p9">CWorker@7351b7d5<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [11] stops working with current count down latch [2]</p>
<p class="p9">CSimulation@5cad8086<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>threads stopped</p>
<p class="p9">CWorker@3d9bc497<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [10] stops working with current count down latch [0]</p>
<p class="p9">CWorker@6826907c<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [13] stops working with current count down latch [1]</p>
<p class="p9">CSimulation@5cad8086<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>simulation is stopped</p>
<p class="p8"><br></p>
<p class="p8"><br></p>
<p class="p8"><br></p>
<p class="p8"><br></p>
<p class="p9">CSimulation@5cad8086<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>simulation is started with [5] threads</p>
<p class="p9">CWorker@b7127ff<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [14] starts working</p>
<p class="p9">CWorker@6441c612<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [15] starts working</p>
<p class="p9">CWorker@67d26a8e<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [16] starts working</p>
<p class="p9">CWorker@193fa958<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [17] starts working</p>
<p class="p9">CWorker@3aa2722f<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [18] starts working</p>
<p class="p8"><br></p>
<p class="p9">CWorker@6441c612<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [15] stops working with current count down latch [3]</p>
<p class="p9">CWorker@193fa958<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [17] stops working with current count down latch [1]</p>
<p class="p9">CWorker@3aa2722f<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [18] stops working with current count down latch [0]</p>
<p class="p9">CSimulation@5cad8086<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>threads stopped</p>
<p class="p9">CWorker@67d26a8e<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [16] stops working with current count down latch [3]</p>
<p class="p9">CSimulation@5cad8086<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>simulation is stopped</p>
<p class="p9">CWorker@b7127ff<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>thread [14] stops working with current count down latch [0]</p>
<p class="p8"><br></p>
<p class="p9">It seems, that the CountDownLatch does not work as expected. Any idea?</p>
<p class="p8"><br></p>
<p class="p9">Phil</p>
</body>
</html>
----------------7041480511460249908--