Path: csiph.com!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Eric Sosman Newsgroups: comp.lang.java.programmer Subject: Re: How do I automatically cleanly terminate a thread? Date: Mon, 17 Jul 2017 11:27:23 -0400 Organization: A noiseless patient Spider Lines: 33 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Mon, 17 Jul 2017 15:23:30 -0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="a3683bc2a147767788aad374f1a1bed9"; logging-data="2061"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX195se8fgkhUX6YFuYjne791" User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 In-Reply-To: Content-Language: en-US Cancel-Lock: sha1:Zrzq66p21rwoYRMzWdkEzAW+wZQ= Xref: csiph.com comp.lang.java.programmer:36958 On 7/17/2017 11:06 AM, Eric Douglas wrote: > I invoke my main test thread. > This test thread creates a new instance of TestClassOne. > TestClassOne creates a new instance of WatchService. > TestClassOne starts a new thread to sit in the background and wait indefinitely. > (https://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html#take()) > Main test thread loses reference to it's instance of TestClassOne (variable set to null). Background thread keeps running. > Instance of TestClassOne should get garbage collected? Can we automatically interrupt the background thread? The JVM holds references to all running threads: They won't become garbage simply because your code forgets about them. Also, a running thread wouldn't stop even if it did somehow become garbage; that would be subject to all the problems that cause Thread::stop and kin to be deprecated. The only safe way to stop a thread is with its cooperation. The stopper arranges some mutually agreed-upon "Please stop soon" signal, like a `volatile boolean' that the stoppee tests now and then. Maybe the stopper also arranges to awaken the stoppee if it might be in a lengthy wait of some kind: It might interrupt the stoppee, or close the socket the stoppee is using, or something of that kind -- whatever will break the waiting thread out of its wait. If all you need is that the thread goes away in order to allow the JVM to terminate, it may be simplest to make it a daemon: Call its setDaemon(true) method before calling start(). The JVM assumes that it's all right to clobber daemon threads when shutting down, the idea being that if the asynchronous shutdown causes corruption it won't matter because the whole Java environment is about to disappear. -- esosman@comcast-dot-net.invalid Twelve hundred eighty-three days to go.