1

定期的に実行する一連のタスクをスケジュールしようとしています。特定の状況では、一部のタスクをスケジューリングから停止する必要があるため、threadPoolExecutor の内部キューからそれらを削除します。私はタスク自体の中でそれを行います

以下は私のアプローチです。タスクの内部から、threadPoolExecutor サービスからタスクを削除するという考えが問題を引き起こす可能性があるかどうかはわかりません。(同期されたメソッド名 'removeTask' を見てください。 .

public class SchedulerDaemon  {


    private ScheduledExecutorService taskScheduler;
    private ScheduledFuture taskResult1, taskResult2;
    private Task1 task1;
    private Task2 task2;


    public SchedulerDaemon(Task1 task, Task2 task2)
    {
        this.task1 = task1;
        this.task2 = task2;1
        taskScheduler = new ScheduledThreadPoolExecutor(1);
    }


    public void start() {
       if(taskScheduler == null) {
           taskScheduler = new ScheduledThreadPoolExecutor(1);
           taskResult = taskScheduler.scheduleAtFixedRate(new TaskWrapper(task1) , 60000,60000, TimeUnit.MILLISECONDS);
           taskResult2 = taskScheduler.scheduleAtFixedRate(new TaskWrapper(task2) , 60000,60000, TimeUnit.MILLISECONDS);

       }
    }


    public void stop() {
        if(taskScheduler != null) {
            taskScheduler.shutdown();
            taskResult1.cancel(false); 
            taskResult2.cancel(false);           
            taskScheduler = null;
            taskResult = null;
        }

    }

        public  synchronized void removeTask( TaskWrapper task){
            ((ScheduledThreadPoolExecutor) taskScheduler).remove(task);
        }

    class TaskWrapper implements Runnable {
        private Task myTask;

        public TaskWrapper(Task task) {
            myTask = task;
        }

        @Override
        public void run() {
            try {
               boolean keepRunningTask = myTask.call();
               if(!keepRunningTask) {

                   ***//Should this cause any problem??***
                   removeTask(this);
               }
            } catch (Exception e) {
                //the task threw an exception remove it from execution queue
                ***//Should this cause any problem??***
                removeTask(this);
            }
        }



    }
}


public Task1 implements Callable<Boolean> {

public Boolean call() {  
if(<something>)
return true;
else
return false;    
}
}



public Task2 implements Callable<Boolean> {

    public Boolean call() {  
    if(<something>)
    return true;
    else
    return false;    
    }
    }
4

2 に答える 2

0

強制的にタスクをキャンセルするのは危険です。そのため、stop は Java から削除するようにマークされているため、代わりに、スレッドに共有フラグを設定する必要があります...

のようなもの:私は生きることができますか?私は生きてもいいですか?番号?よし、帰ります!この継ぎ目は非常に安全な方法です!

于 2013-07-16T23:53:12.503 に答える