问题描述
我正在创建一个Java应用程序,其中正在使用scheduledexecutorservice和ScheduledFuture,我的计划工作正常,但是有一个小问题,如果ScheduledFuture一旦启动一次,我找不到中断Runnable类的选项,则抛出任何自定义异常或调用任何将停止我当前正在运行的任务的方法,即使我们调用future.cancle(true),ScheduledFuture也会完成任务。
public class TaskScheduler {
public TaskScheduler() {
future = executor.schedule(new JobTask(),object.getStart_time().getTime() - new Date().getTime(),TimeUnit.MILLISECONDS);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printstacktrace();
}
//This cancel do not stop the above started future task
System.out.println(future.cancel(true));
}
scheduledexecutorservice executor = Executors.newScheduledThreadPool(1,new
ThreadFactoryBuilder().setNameFormat("Thread1").build());
ScheduledFuture<?> future = null;
class JobTask implements Runnable {
@Override
public void run() {
try {
//running job
} catch ( Throwable t ) {
System.out.println(t);
}
}
// Is it possible to call any method on cancel
public void interrupt() {
//logic,flag or throws exception?
}
}
@Override
public void run() {
System.out.println("Started");
int a = 1;
long startTime = System.currentTimeMillis();
int number = 2;
int count = 0;
long sum = 0;
while(count < 10000) {
if(isPrimeNumber(number)) {
sum += number;
count++;
}
number++;
}
System.out.println(sum);
fib2();
long endTime = System.currentTimeMillis();
long duration = (endTime - startTime);
System.out.println(duration);
}
public void primes () {
}
private boolean isPrimeNumber(int number) {
for (int i=2; i<=number/2; i++) {
if(number % i == 0) {
return false;
}
}
return true;
}
public int numOfDigit(BigDecimal result){
String s = "" + result;
return s.length();
}
public void fib2(){
BigDecimal[] dig = new BigDecimal[2];
dig[0] = BigDecimal.valueOf(0);
dig[1] = BigDecimal.valueOf(1);
BigDecimal result = BigDecimal.valueOf(0);
int c = 1;//term
while(true){
result = dig[0].add(dig[1]);
dig[0] = dig[1];
dig[1] = result;
//check if it has 1000 digits
if(numOfDigit(result) == 1000){
System.out.println("Term: " + ++c);
break;
}
++c;
}
}
解决方法
ScheduledThreadPoolExecutor.setRemoveOnCancelPolicy(true)是这里的关键因素
您可以转换执行程序服务引用以调用该方法
ScheduledThreadPoolExecutor ex = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(1,new
ThreadFactoryBuilder().setNameFormat("Thread1").build());
ex.setRemoveOnCancelPolicy(true);
或创建新的ScheduledThreadPoolExecutor,如下所示:
ScheduledThreadPoolExecutor ex = new ScheduledThreadPoolExecutor(1,new
ThreadFactoryBuilder().setNameFormat("Thread1").build());
--and now set RemoveOnCancelPolicy
ex.setRemoveOnCancelPolicy(true);