有什么办法可以在ScheduledFuture Cancel方法上中断或引发自定义异常?

问题描述

我正在创建一个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);