像下面这样的东西可能会帮助你的需求 -
import java.util.Timer;
import java.util.TimerTask;
public class TimerGracefulShutdown {
public static void main(String[] args) throws InterruptedException {
//This is a synchronization helper class
SyncHelper syncHelper = new SyncHelper();
TimerManager myTimerManager = new TimerManager(syncHelper);
//Try stopping timer after 5 seconds (it wont stop until the 30 seconds sleep of timertask does not finish)
Thread.currentThread().sleep(5000);
System.out.println("Going to stop my timer now");
myTimerManager.stopTimer();
System.out.println("Cancelled timer");
}
}
class TimerManager {
SyncHelper syncHelper;
Timer timer;
public TimerManager(SyncHelper syncHelper) {
this.syncHelper = syncHelper;
startTimer();
}
private void startTimer() {
timer = new Timer(true);
TimerTask myTask = new MyTimerTask(syncHelper);
timer.scheduleAtFixedRate(myTask, 0, 100000);
}
public void stopTimer() {
try {
syncHelper.testAndSetOrReset("acquire");
} catch(Exception e) {
e.printStackTrace();
}
//Shutdown the timer here since you know that your timertask is not executing right now.
timer.cancel();
try {
syncHelper.testAndSetOrReset("release");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyTimerTask extends TimerTask {
private SyncHelper syncHelper;
public MyTimerTask(SyncHelper syncHelper) {
this.syncHelper = syncHelper;
}
public void run() {
try {
syncHelper.testAndSetOrReset("acquire");
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("Over here");
try {
Thread.currentThread().sleep(30000);
} catch(Exception e) {
}
System.out.println("Done sleeping");
//Finally release the helper.
try {
syncHelper.testAndSetOrReset("release");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class SyncHelper {
private int index = 0;
public synchronized void testAndSetOrReset(String command) throws Exception {
if("acquire".equals(command)) {
if(index == 1) {
wait();
}
index++;
} else if("release".equals(command)) {
index--;
notifyAll();
}
}
}