001 package org.codehaus.mojo.exec;
002
003 /**
004 * Created by IntelliJ IDEA.
005 * User: dsmiley
006 * Date: Jan 19, 2007
007 * Time: 4:43:19 PM
008 * To change this template use File | Settings | File Templates.
009 */
010 public class MainUncooperative extends Thread
011 {
012 public static final String SUCCESS = "1(interrupted)(f)2(f)";
013
014 public static void main( String[] args )
015 throws InterruptedException
016 {
017 Thread daemonThread = new MainUncooperative();
018 daemonThread.setDaemon( true );
019 daemonThread.start();
020 Thread.sleep( 1000 );
021 //returns to caller now
022 }
023
024 final long SIMWORKTIME = 15*1000;//15 seconds of work which is going to be more than exec:java wants to wait
025
026 public void run()
027 {
028 boolean interruptedOnce = false;
029 long startedTime = System.currentTimeMillis();
030 for(int lap = 1; true; lap++ )
031 {
032 long remainingWork = SIMWORKTIME - (System.currentTimeMillis() - startedTime);
033 if ( remainingWork <= 0 )
034 {
035 break;//done
036 }
037 try
038 {
039 System.out.print( lap );
040 Thread.sleep(remainingWork);//simulates doing work
041 System.out.print( "(done)" );
042 break;
043 }
044 catch ( InterruptedException e )
045 {
046 //We want to ensure this only gets reported once. It's possible depending on a race condition for
047 // ExecJavaMojo.terminateThreads() to interrupt this thread a second time.
048 if ( ! interruptedOnce )
049 {
050 System.out.print( "(interrupted)" );
051 }
052 interruptedOnce = true;
053
054 //be uncooperative; don't quit and don't set interrupted status
055 }
056 finally
057 {
058 System.out.print("(f)");//we should see this if Thread.stop() is called
059 }
060 }
061 }
062 }