Q&A: Wie kann man einem Thread eine bestimmte Zeit zur Ausführung geben?

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.

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert