У треда должна быть обертка, в которой будет булево свойство (interruptionRequested, например), которую треду необходимо проверять самостоятельно между атомарными операциями своей полезной нагрузки. ("Скопировал файл, проверил - false, скопировал следующий, проверил - false, скопировал еще один, проверил - true, завершился").
То есть тред сам решает, когда ему остановится, но мы можем посигналить ему об этом. Иначе мы рискуем поломать данные, т.к. не будем наверняка знать, в каком состоянии они находятся.