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.