Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!eu.feeder.erje.net!ecngs!feeder2.ecngs.de!217.188.199.168.MISMATCH!takemy.news.telefonica.de!telefonica.de!feed.news.schlund.de!schlund.de!news.online.de!not-for-mail From: Philipp Kraus Newsgroups: comp.lang.java.programmer Subject: Re: thread pool Date: Tue, 22 Jul 2014 21:38:55 +0200 Organization: 1&1 Internet AG Lines: 94 Message-ID: References: NNTP-Posting-Host: p5b0c5f17.dip0.t-ipconnect.de Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Trace: online.de 1406057935 23073 91.12.95.23 (22 Jul 2014 19:38:55 GMT) X-Complaints-To: abuse@einsundeins.com NNTP-Posting-Date: Tue, 22 Jul 2014 19:38:55 +0000 (UTC) User-Agent: Unison/2.1.10 Xref: csiph.com comp.lang.java.programmer:29206 On 2014-07-22 13:11:14 +0000, Eric Sosman said: > On 7/22/2014 9:00 AM, Philipp Kraus wrote: >> Hello, >> >> I would like to create a thread pool with threads, which are should >> stopped by the user. >> So I create my pool with >> >> m_pool = Executors.newCachedThreadPool(); >> for (int i = 0; i < m_barrier.getParties(); i++) >> m_pool.submit(new Worker(m_barrier)); >> >> my Worker implements Runnable with the run-method >> >> while (!Thread.currentThread().isInterrupted()) { >> // do something >> } >> >> Within the while-loop I run my barrier and I catch the InterruptedException >> >> I would like to create a thread pool with a number of threads, which >> runs until the user >> sends a stop signal. At the moment I run m_pool.shutdown() and/or >> shutdownNow(), but >> which way is the correct Java structure. My target is, that a method >> creates all threads >> of the pool, each thread runs unlimited time until the user sends a stop >> signal. > > If "each thread runs unlimited time," why use a thread pool? The > purpose of this kind of pool is to run many short-lived (usually) tasks > on a set of threads, with each thread handling many tasks in succession. > You don't need that (it seems), so wouldn't it be simpler to launch > as many threads as you want and just let them run? When it's time to > stop you can interrupt them all (telling them to quit) and join them > all (so you'll know when all the quitting's finished). > > If that doesn't seem to meet your need, please describe what you're > trying to do in more detail. This works very fast :-) but I have got a problem with the thread interrupt. I create a thread pool with: m_threadcounter = new CountDownLatch(m_barrier.getParties()); for (int i = 0; i < m_barrier.getParties(); i++) new CWorker(m_runners, m_threadcounter, m_barrier, i == 0, m_world, m_currentstep).start(); and stop the pool with: try { m_runners.interrupt(); m_threadcounter.await(); } catch (InterruptedException l_exception) { m_Logger.error(l_exception.getMessage()); } m_runners is a ThreadGroup; The thread run shows: while (!Thread.currentThread().isInterrupted()) { // do something try { Thread.sleep(CConfiguration.getInstance().get().ThreadSleepTime); } catch (InterruptedException l_exception) { Thread.currentThread().interrupt(); } } m_counter.countDown(); This works fine on the first run. After I run the stop part once and run the creation part again all new threads a stopped, because the interrupt flag is set, so my new thread dows not run the while loop within the run. So I would like to create a a thread group, run it, stop it and create a group again. I cannot set the thread to sleep, because the data which is used by the threads must be reinitialize if the group is created Thanks a lot Phil