Eine Idee ist, nicht einen eigenen Thread selbst zu starten — was man sowieso nicht so oft macht — sondern einen ThreadPool aus Java 5 mit einzusetzen (Executors#newCachedThreadPool() ), der einen Executer (ExecutorService) implementiert. Der ExecutorService hat eine Funktion submit(Runnable task), die ein Future liefert. Mit diesem Future arbeitest du dann mit get(long timeout, TimeUnit unit).
Code:
package com.tutego;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class ExitAfterATime
{
public static void main( String[] args )
{
ExecutorService es = Executors.newCachedThreadPool();
Future<?> submit = es.submit( new Runnable() {
@Override public void run()
{
try { Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println("InterruptedException"); }
} } );
try
{
submit.get( 500, TimeUnit.MILLISECONDS );
}
catch ( InterruptedException e )
{
}
catch ( ExecutionException e )
{
}
catch ( TimeoutException e )
{
System.out.println( "Canceling" );
submit.cancel( true );
System.out.println( "Canceling Done" );
}
es.shutdownNow();
}
}
Es gibt noch andere Lösungen und das concurrent Paket bietet viele Möglichkeiten. Der Programmcode muss aber mitspielen und auch beendet werden können, also cancel(…) unterstützen.