import scala.concurrent._ import java.util.concurrent.atomic.AtomicReference def interruptableFuture[T](fun: Future[T] => T)(implicit ex: ExecutionContext): (Future[T], () => Boolean) = { val p = Promise[T]() val f = p.future val aref = new AtomicReference[Thread](null) p tryCompleteWith Future { val thread = Thread.currentThread aref.set(thread) try fun(f) finally { val wasInterrupted = (aref getAndSet null) ne thread //Deal with interrupted flag of this thread in desired } } (f, () => { Option(aref getAndSet null) foreach { _.interrupt() } p.tryFailure(new CancellationException) }) }