O método interrupt força a execução assíncrona de uma exceção do tipo InterruptedException.
Acontece que a verificação dessa exceção não ocorre em qualquer parte do código, mas sim apenas quando o código está em uma parte em que chama alguma rotina do sistema operacional.
Por exemplo, se sua thread estiver em loop executando apenas código que não chama o sistema operacional (por exemplo, efetuando algum cálculo matemático), a exceção não será verificada e a thread continuará rodando.
Se o método estiver sendo executado e chamar alguma rotina do sistema operacional que verifique a interrupção, a exceção será verificada e lançada.
Portanto, você pode ter comportamentos um pouco diferentes no Windows e no Unix.
No Unix, por exemplo, qualquer operação de disco pode ser interrompida; no caso do Windows, algumas operações de disco não podem ser interrompidas (tipicamente quando usando java.nio). Na prática, no caso do Windows, garantimos apenas que as operações Object.wait, Thread.sleep etc. (as que estão listadas no javadoc de Thread.interrupt: http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#interrupt() ) consigam ser interrompidas com sucesso.
Você pode ter, por exemplo, código que consiga copiar arquivos e parar com sucesso no caso do Linux mas não no caso do Windows.