任务取消
如果外部代码能在某个操作正常完成之前将其置入“完成”状态,那么这个操作就可以称为可取消的。
取消的原因:
用户请求取消:点击取消按钮或管理接口发出取消请求。
有时间限制的操作:有限时间内完成某些任务,当计时器超时,需要取消所有未完成的任务。
应用程序事件:例如应用程序对某个问题空间进行分解并搜索,使不同的任务可以搜索问题空间中的不同区域。当其中一个任务找到了解决方案时,其他任务仍在搜索的任务都将被取消。
错误:网页爬虫程序搜索相关的页面,并将页面或摘要数据保存到硬盘。当一个爬虫任务发生错误时,那么所有搜索任务都会取消,此时可能会记录他们当前状态,以便稍后重新启动。
关闭:当一个程序或服务关闭时,必须对正在处理或等待处理的工作执行某种操作。在平缓的关闭过程中,当前正在执行的任务将继续执行直到完成,而在立即关闭过程中,当前的任务则可能取消。
方法1.设置某个“已请求取消的”标志,使用volatile类型的域来保存取消状态
@ThreadSafe
public static PrimeGenerator implements Runnable{
@GuardedBy("this")
private final List<BigInteger>primes=new ArrayList<BigInteger>();
private volatile boolean cancelled;
public void run(){
BigInteger p=BigInteger.ONE;
while(!cancelled){
p=p.nextProbablePrime();
synchronized(this){
primes.add(p);
}
}
}
public void cancel(){ cancelled=true; }
public synchronized List<BigInteger>get(){
return new ArrayList<BigInteger>(primes);
}
}
一个仅运行一秒的素数生成器
List<BigInteger>aSecondOfPrimes()throws InterruptedException{
PrimeGenerator generator=new PrimeGenerator();
new Thread(generator).start();
try{
SECODES.sleep(1);
}finally{
generator.cancel();
}
return generator.get();
}