Simply, a subroutine is code you write and call as required, an interrupt is system bound and cannot be called by the user but occurs when something happens (sources are hardware, software and CPU) that requires immediate attention. You write subroutines to handle interrupts.