# Thread eine bestimmte Zeit zur Ausführung geben



## Ingatz (1. Jul 2007)

Hi,

wie kann ich einem Thread eine bestimmte Zeit zur Ausführung geben und, falls er länger braucht, abbrechen.

Problem ist folgendes:
Habe folgenden Code:

```
Thread t = new Thread();
t.start();
t.join();
```

Leider wartet join() ewig auf den Thread bis er terminiert. Wie kann ich nach X Sekunden den Thread abbrechen?


----------



## Beni (1. Jul 2007)

Du kannst "interrupt" aufrufen. Das setzt im Thread ein Flag, das der ausführende Code abfragen kann:


```
public void run(){
  while( !Thread.interrupted() ){
    // irgendwas machen, wenn interrupted die Schleife verlassen
  }
}
```


----------



## Ullenboom (1. Jul 2007)

Hallo Ingatz,

eine Idee ist, nicht einen eigenen Thread 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).


```
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;

/**
 * @author Christian Ullenboom | [url]http://www.tutego.com/[/url]
 */
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.

Grüße

 Christian


----------

