2013-03-13 22 views
0

我在理解ScheduledThreadPoolExecutor如何工作(我使用SCA,所以不用打擾代碼中的註釋)時遇到了一些小問題。這部分的代碼從我的調度器類:使用ScheduledThreadPoolExecutor時中斷和重啓任務

@AllowsPassByReference 
public ScheduledFuture<?> schedule(Task task) 
{ 
    future=scheduler.scheduleAtFixedRate(task.getRunnableContent(), task.getDelay(), task.getPeriod(), TimeUnit.MILLISECONDS); 
    return future; 
} 

@AllowsPassByReference 
public void deschedule(Task task) 
{ 
    scheduler.remove(task.getRunnableContent()); 
} 

而這部分代碼從我的任務等級:

public void scheduleTask() 
{ 
    if(!running) 
    { 
     future=scheduler.schedule(this); 
     running=true; 
    } 
} 

public void descheduleTask() 
{ 
    if(running) 
    { 
     future.cancel(mayInterruptIfRunning); 
     scheduler.deschedule(this); 
     running=false; 
    } 
} 

現在,這裏的大問題!我看到的所有地方在ScheduledFutures上使用cancel,然後在調度器上使用shutdown方法,但我不想停止調度器。讓我更好地解釋一下:在這個應用程序中,定期任務必須隨時調度,停止和重新調度,所以我需要一種方法來中斷一個任務,一旦它開始運行而不關閉整個調度程序服務。我希望你能理解我想要做什麼,有什麼建議?謝謝:)

回答

0

當我們取消一個週期性任務時,這個任務的後續調度將被取消,但是調度器本身將會運行並且可以用於調度另一個任務。

如果我們調用Future.cancel時,正在運行的任務,然後

一)Future.cancel(假)不會影響到正在運行的任務

B)Future.cancel(真)將調用Threed。中斷任務的線程,但運行任務是否停止取決於任務實現。例如,該任務可能會捕獲InterruptedException(如果有)並繼續工作。

+0

感謝您的回答,至少現在我知道我遇到的問題必須與SCA如何管理我的課程有關 – user2163438 2013-03-13 03:26:08

相關問題