вы можете использовать прерванное состояние потока демона
public class StoppableTask extends Runnable{
private Thread thr;
public StoppableTask(){
}
public void run() {
try{
while (true) {
// do some stuff...
if(Thread.interrupted())throw new InterruptedException();
//do some more stuf
}
}catch(InterruptedException e){
return;//we expect this and just stop when we get it
}
}
public void tellMeToStop() {
thr.interrupt();
}
public void start(){
if(thr!=null)return;
thr = new Thread(this);
thr.setDeamon(true);
thr.start();
}
public static void main(String[] args) {
StoppableTask t = new StoppableTask();
t.start();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
t.tellMeToStop();
}
обратите внимание, что важно распространять исключения прерывания (или сбрасывать статус прерывания с помощью Thread.currentThread().interrupt()
) из вызываемых методов в цикл while, чтобы это имело эффект