Se stai usando Java, usa Thread.interrupt - questo è esattamente lo scenario per il quale è stato progettato il sistema.
Altrimenti, dovrai vedere quali sono le primitive di sincronizzazione fornite dalla tua lingua. Se ha una classe di sincronizzazione degli eventi, usala (effettua periodicamente il polling dell'evento nel thread di lavoro e termina se viene attivata, segnala l'evento se l'utente fa clic sul pulsante). Gli eventi a volte vengono chiamati Condizione, quindi controlla anche il nome.
In caso contrario, dovrai implementarne uno tu stesso, usando qualunque barriera primitiva della tua barriera di memoria. Tutto ciò che serve è una classe con una variabile booleana inizializzata su false e due metodi: set, che imposta la variabile su true ed esegue una barriera di scrittura, e get, che esegue una barriera di lettura e restituisce la variabile. Nella maggior parte delle lingue, se non si dispone di esplicite operazioni di barriera della memoria, è possibile utilizzare qualsiasi operazione di esclusione reciproca.