A few suggestions:
make the interrupted exception thrown from all blocking io.
specify the interrupted flag mean only interrupt to kill, not the
other things developers use it for -> means on interrupted, it can't
clear the flag.
make the interrupted exception a runtime exception
(consequence, separate runtime exception from exception, as it own
subtype or make it uncatchable)
maybe make while(true) really mean while(!interrupted) ?