InterruptedException是Java中的一个异常,它通常是由Thread.sleep()、Object.wait()和Thread.join()等方法抛出的,表示线程在阻塞状态被中断了。
当一个线程被中断时,Java虚拟机会抛出InterruptedException异常,以通知线程已被中断。此时,线程可以选择立即终止,或者继续执行任务。如果线程继续执行任务,需要在catch块中重新调用Thread.currentThread().interrupt()来重新中断线程。
下面是两个简单的示例:
示例1
public class Main {
public static void main(String[] args) {
Thread t = new Thread(new Task());
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.interrupt();
}
}
class Task implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Task is running");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
System.out.println("Task is interrupted and exit");
}
}
在这个示例中,主线程启动了一个Task线程,并等待1秒后中断该线程。Task线程在运行期间会每隔5秒输出一条信息。
如果Task线程没有被中断,它会一直输出信息。当Task线程被中断时,它会立即退出,并输出一条信息。
注意,在catch块中需要再次中断线程,以保证线程继续保持中断状态。
示例2
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new Task());
try {
String result = future.get(1000, TimeUnit.MILLISECONDS);
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
future.cancel(true);
e.printStackTrace();
}
executor.shutdown();
}
}
class Task implements Callable<String> {
public String call() throws Exception {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Task is running");
Thread.sleep(5000);
}
System.out.println("Task is interrupted and exit");
return "Task interrupted";
}
}
在这个示例中,主线程使用ExecutorService来执行一个Task任务,并设置了1秒的超时时间。如果1秒内任务没有执行完毕,则会中断该任务。
如果Task任务在1秒内执行完毕,主线程会输出任务的返回值。如果在1秒内任务没有执行完毕,则会捕获TimeoutException异常,终止任务并输出异常信息。
在Task任务中,如果线程被中断,则会立即退出,并输出一条信息。注意,在这个示例中不需要再次中断线程,因为Callable中的call()方法可以抛出异常。