Java中的InterruptedException是什么?

  • Post category:Java

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()方法可以抛出异常。