Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!eternal-september.org!feeder.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail From: Jeff Higgins Newsgroups: comp.lang.java.programmer Subject: Re: javax.swing.Timer blocking program termination Date: Tue, 14 Jul 2015 10:15:38 -0400 Organization: A noiseless patient Spider Lines: 180 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Tue, 14 Jul 2015 14:17:54 +0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="8e164d158183579609bf09837dee5210"; logging-data="3270"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/iYay3X26yr/SfRMIe/tyFrkkDYaTybpo=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0 In-Reply-To: Cancel-Lock: sha1:CE+z5bC8IUrs3LXUCNUaaAz4o5o= Xref: csiph.com comp.lang.java.programmer:32006 On 07/14/2015 09:31 AM, e.d.programmer@gmail.com wrote: > On Monday, July 13, 2015 at 10:17:14 PM UTC-4, Jeff Higgins wrote: >> On 07/13/2015 09:35 PM, Jeff Higgins wrote: >>> On 07/13/2015 08:46 PM, Knute Johnson wrote: >>>> On 7/13/2015 17:27, Jeff Higgins wrote: >>>>> On 07/13/2015 07:03 PM, Knute Johnson wrote: >>>>>> So I have this program that uses a couple of javax.swing.Timers. I >>>>>> forgot to put in code to stop one of the timers yet the program would >>>>>> still terminate. I have set the default close operation for the frame >>>>>> to be DISPOSE_ON_CLOSE. >>>>>> >>>>>> What I found was that a timer of less the 1000ms would prevent an >>>>>> application based on a JFrame from stopping but 1000ms or more and it >>>>>> would stop just fine. >>>>>> >>>>>> I know that javax.swing.Timer uses a common thread for all timers but I >>>>>> don't see anywhere that describes the stopping behavior. >>>>>> >>>>>> The program below will stop if the JFrame is closed and the timer is >>>>>> 1000ms or greater but hang if it is less. I would be really curious to >>>>>> know if somebody else can duplicate this. >>>>>> >>>>>> import java.awt.*; >>>>>> import java.awt.event.*; >>>>>> import javax.swing.*; >>>>>> >>>>>> public class test extends JFrame { >>>>>> public test() { >>>>>> Timer timer = new Timer(1000,event -> {}); >>>>>> setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); >>>>>> setSize(400,300); >>>>>> setVisible(true); >>>>>> timer.start(); >>>>>> } >>>>>> >>>>>> public static void main(String... args) { >>>>>> EventQueue.invokeLater(() -> new test()); >>>>>> } >>>>>> } >>>>>> >>>>> >>>>> >>>>> import java.awt.EventQueue; >>>>> import javax.swing.JFrame; >>>>> import javax.swing.Timer; >>>>> >>>>> public class test extends JFrame { >>>>> public test() { >>>>> Timer timer = new Timer(900, event -> { >>>>> System.out.println("-"); }); >>>>> addWindowListener(new java.awt.event.WindowAdapter() { >>>>> @Override >>>>> public void windowClosing(java.awt.event.WindowEvent >>>>> windowEvent) { >>>>> System.out.println("Close"); }}); >>>>> setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); >>>>> setSize(400, 300); >>>>> setVisible(true); >>>>> timer.start(); >>>>> } >>>>> >>>>> public static void main(String... args) { >>>>> EventQueue.invokeLater(() -> new test()); >>>>> } >>>>> } >>>>> >>>>> >>>>> jeff@debian:~$ javac test.java >>>>> jeff@debian:~$ java -showversion test >>>>> java version "1.8.0_40" >>>>> Java(TM) SE Runtime Environment (build 1.8.0_40-b25) >>>>> Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode) >>>>> >>>>> - >>>>> - >>>>> Close >>>>> - >>>>> - >>>>> - >>>>> - >>>>> ^Z >>>>> [1]+ Stopped java -showversion test >>>>> jeff@debian:~$ jobs >>>>> [1]+ Stopped java -showversion test >>>>> jeff@debian:~$ fg >>>>> java -showversion test >>>>> - >>>>> - >>>>> - >>>>> - >>>>> ^Cjeff@debian:~$ >>>>> >>>>> >>>> >>>> and does it stop on your Linux (I assume) system if the delay is 1000ms >>>> or more? >>>> >>> Very consistantly >>> With 1000 it continues as long as I can stand. >>> With 1001 I get >>> - >>> Close >>> - >>> - >>> - >>> - >>> jeff@debian:~$ >>> >>> With 1002 I get >>> - >>> Close >>> - >>> - >>> - >>> jeff@debian:~$ >>> >>> With 1003 I get >>> - >>> Close >>> - >>> jeff@debian:~$ >>> >>> With 1500 I get >>> - >>> Close >>> - >>> jeff@debian:~$ >>> >>> >> If I put a timer.stop() >> >> addWindowListener(new java.awt.event.WindowAdapter() { >> @Override >> public void windowClosing(java.awt.event.WindowEvent windowEvent) >> { System.out.println("Close"); timer.stop();}}); >> >> for values of 1000 or less continues to print - >> for values greater than 1000 doesn't print any - after Close > > Why wouldn't a timer stop? I pasted that in and the last thing it always prints is the "Close". I'm running this test in Eclipse Luna on JDK 8 update 45 on Windows 8.1. > Re-running, it always closes with timer.stop(). I don't know what I was running with the above? Now, I still don't know why the short timer1 (below) keeps the EDT active unless I explicitly stop it in windowClosing? import java.awt.EventQueue; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.Timer; public class test extends JFrame { public test() { Timer timer1 = new Timer(1000, event -> {}); Timer timer2 = new Timer(1100, event -> {}); Timer.setLogTimers(true); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent windowEvent) { System.out.println("Close"); }}); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(400, 300); setVisible(true); timer1.start(); timer2.start(); } public static void main(String... args) { EventQueue.invokeLater(() -> new test()); } }