The "Callable" interface is provided exactly for this purpose. The code below creates a thread once without throwing an exception and creates a thread a second time in order to throw an exception. There isn't much to it really, once you see it done, but getting there can be difficult.
Of course there are some intricacies, but this should get anyone started. If this gets you excited the next exciting thing may be a BlockingQueue.
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String args[]) {
// create an executor service to execute our threads (tasks)
ExecutorService executor = Executors.newCachedThreadPool();
// create a new thread/task
FutureTasktask = new FutureTask (new SomeThread(false));
executor.submit(task); // execute the thread
// we must shutdown the executor service in order to know when all
// submitted tasks have completed..
executor.shutdown();
try {
// wait a maximum of 5 seconds for the thread to terminate
// (normally or with an error).
executor.awaitTermination(5, TimeUnit.SECONDS);
// output whatever value the thread returned.
System.out.println("The task returned: " + task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
executor = Executors.newCachedThreadPool();
task = new FutureTask(new SomeThread(true));
executor.submit(task);
executor.shutdown();
try {
executor.awaitTermination(5, TimeUnit.SECONDS);
// The error is returned when we call the .get() method.
System.out.println("The task returned: " + task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
} // end of main.
static class SomeThread implements Callable{
boolean throwAnError = false;
public SomeThread(boolean throwAnError) {
this.throwAnError = throwAnError;
}
public String call() throws Exception {
System.out.println("Sleeping...");
Thread.sleep(2000);
System.out.println("Done sleeping!");
if (throwAnError) {
throw new Exception("Oh no, an exception!");
}
return "some return value";
}
} // end of SomeThread.
}
No comments:
Post a Comment