001    package org.codehaus.mojo.exec;
002    
003    import java.util.Timer;
004    import java.util.TimerTask;
005    
006    /**
007     * @author <a href="mailto:dsmiley@mitre.org">David Smiley</a>
008     */
009    public class MainWithThreads extends Thread
010    {
011        public static final String ALL_EXITED = "t1(interrupted td)(cancelled timer)";
012        public static final String TIMER_IGNORED = "t1(interrupted td)";
013    
014        /** 
015         * both daemon threads will be interrupted as soon as the non daemon thread is done.
016         * the responsive daemon thread will be interrupted right away.
017         * - if the timer is cancelled (using 'cancelTimer' as argument), the timer will die on itself
018         * after all the other threads
019         * - if not, one must use a time out to stop joining on that unresponsive daemon thread
020         **/
021        public static void main( String[] args )
022        {
023            // long run so that we interrupt it before it ends itself
024            Thread responsiveDaemonThread = new MainWithThreads( 60000, "td" );
025            responsiveDaemonThread.setDaemon( true );
026            responsiveDaemonThread.start();
027    
028            new MainWithThreads( 200, "t1" ).start();
029    
030            // Timer in Java <= 6 aren't interruptible
031            final Timer t = new Timer( true );
032    
033            if ( optionsContains( args, "cancelTimer" ) )
034            {
035                t.schedule( new TimerTask()
036                {
037                    public void run()
038                    {
039                        System.out.print( "(cancelled timer)" );
040                        t.cancel();
041                    }
042                }, 400 );
043            }
044        }
045    
046        private static boolean optionsContains( String[] args, String option )
047        {
048            for (int i = 0; i < args.length; i++ )
049            {
050                if ( args[i].equals( option ) )
051                    return true;
052            }
053            return false;
054        }
055    
056        private int millisecsToSleep;
057        private String message;
058    
059        public MainWithThreads( int millisecsToSleep, String message )
060        {
061            this.millisecsToSleep = millisecsToSleep;
062            this.message = message;
063        }
064    
065        public void run()
066        {
067            try
068            {
069                Thread.sleep( millisecsToSleep );
070            }
071            catch ( InterruptedException e ) // IE's are a way to cancel a thread
072            {
073                System.out.print( "(interrupted " + message + ")" );
074                return;
075            }
076            System.out.print( message );
077        }
078    }