Существует множество способов сделать это, используя много разных библиотек.Вы можете использовать какой-либо подход AOP или позволить Spring инструктировать ваши классы, использовать коммерческие решения и т. Д.
Если вы ищете простой подход, который вы могли бы реализовать вручную, тогда это один из них.
Вы можете создать подкласс java.util.concurrent.ThreadPoolExecutor
и переопределить два метода:
protected void beforeExecute(Thread t, Runnable r) { }
и
protected void afterExecute(Runnable r, Throwable t) { }
Эти методы ничего не делают в их реализации по умолчанию, но какJavadoc говорит:
Метод, вызываемый до выполнения данного Runnable в данном потоке.Этот метод вызывается потоком {@code t}, который будет выполнять задачу {@code r}, и может использоваться для повторной инициализации ThreadLocals или для ведения журнала .
В этих методах вы можете собрать свою собственную информацию о времени для Runnables и записать их в файл.