1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 package org.apache.commons.httpclient.util;
32
33 /***
34 * <p>
35 * Executes a task with a specified timeout.
36 * </p>
37 * @author Ortwin Glueck
38 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
39 * @version $Revision$
40 * @since 2.0
41 */
42 public final class TimeoutController {
43
44 /***
45 * Do not instantiate objects of this class. Methods are static.
46 */
47 private TimeoutController() {
48 }
49
50 /***
51 * Executes <code>task</code>. Waits for <code>timeout</code>
52 * milliseconds for the task to end and returns. If the task does not return
53 * in time, the thread is interrupted and an Exception is thrown.
54 * The caller should override the Thread.interrupt() method to something that
55 * quickly makes the thread die or use Thread.isInterrupted().
56 * @param task The thread to execute
57 * @param timeout The timeout in milliseconds. 0 means to wait forever.
58 * @throws TimeoutException if the timeout passes and the thread does not return.
59 */
60 public static void execute(Thread task, long timeout) throws TimeoutException {
61 task.start();
62 try {
63 task.join(timeout);
64 } catch (InterruptedException e) {
65
66 }
67 if (task.isAlive()) {
68 task.interrupt();
69 throw new TimeoutException();
70 }
71 }
72
73 /***
74 * Executes <code>task</code> in a new deamon Thread and waits for the timeout.
75 * @param task The task to execute
76 * @param timeout The timeout in milliseconds. 0 means to wait forever.
77 * @throws TimeoutException if the timeout passes and the thread does not return.
78 */
79 public static void execute(Runnable task, long timeout) throws TimeoutException {
80 Thread t = new Thread(task, "Timeout guard");
81 t.setDaemon(true);
82 execute(t, timeout);
83 }
84
85 /***
86 * Signals that the task timed out.
87 */
88 public static class TimeoutException extends Exception {
89 /*** Create an instance */
90 public TimeoutException() {
91 }
92 }
93 }