Because isInterrupted() returns false, when the runEngine() method returns on the InterruptedException.

From the book "Java Concurrency in Practice":

Blocking library methods like Thread.sleep and Object.wait try to detect
when a thread has been interrupted and return early. They respond to interruption by clearing the interrupted status and throwing InterruptedException,
indicating that the blocking operation completed early due to interruption.

The interrupted state is cleared when you get the exception. You can reset it before return:

Actually, you should do this because your task code is executed by a thread pool, and it's good behaviour to preserve the interrupted state after your task code has processed it. So that the thread pool can respond to the interruption as well.

Email codedump link for Terminating Thread.Sleep() when another Thread terminates?