fut.get () является блокирующим вызовом, даже после истечения времени ожидания вы будете блокировать, пока задача не будет выполнена. Если вы хотите остановиться как можно ближе к 5-минутной отметке, вам нужно проверить флаг прерывания, я просто рекомендую вам сделать это с помощью метода Thread.isInterrupted (), который сохраняет состояние прерывания. Если вы хотите просто немедленно остановиться и не нужно очищать какое-либо состояние, генерируйте исключение, которое будет перехвачено Future и указано вам как ExecutionException.
fut.cancel (true) ничего не делает, так как метод invokeAll () уже сделал это для вас.
Если вы не используете коллекцию "tasks" где-то еще, вам, вероятно, не нужно вызывать clear () для нее. Это не будет источником вашей проблемы, так как метод invokeAll () выполняется со списком к тому времени, когда вы вызываете clear (). Но если вам нужно начать формировать список новых задач для выполнения, я предлагаю вам сформировать новый список задач, а не использовать старый список новых задач.
К сожалению, у меня нет ответа на вашу проблему. Я не вижу достаточно информации здесь, чтобы диагностировать это. Ничто в предоставленном вами фрагменте кода не указывает на неправильное (только ненужное) использование библиотечных классов / методов. Возможно, если вы включили полную трассировку стека вместо ошибки в одну строку.