Если ваша функция выполняет много циклов, вы можете проверять истекшее время во время каждой итерации цикла ... но если она заблокирована чем-то на длительный период, тогда вам нужен другой поток, обрабатывать информацию о времени, пока нить, которую вы синхронизируете, заблокирована.