Executor关闭操作备份未完成的任务

public class TrackingExecutor extends AbstractExecutorService{
    
    
  private final ExecutorService exec;
  private final Set<Runnable> tasksCancelledAtShutdown = Collections.synchronized(new HashSet<Runnable>());
  ...

 public List<Runnable> getCancelledTasks(){
    
    
   if(!exec.isTerminated()){
    
    
     throw new IllegalStateException();
   }
   return new ArrayList<Runnable>(tasksCencelledAtShutdown);
 }

 public void execute(final Runnable runnable){
    
    
   exec.execute(
     new Runnable(){
    
    
       public void run(){
    
    
         try{
    
    
           runnable.run();
         }finally{
    
    
           if(isShutdown() && Thread.currentThread().isInterrupted()){
    
    
             tasksCancelledAtShutdown.add(runnable);
           }
         }
       }
     }
   );
 }
}

public abstract class WebCrawler{
    
    
  private volatile TrackingExecutor exec;
  private final Set<URL> urlsToCrawl = new HashSet<URL>();
  ...
  public synchronized void start(){
    
    
    exec = new TrackingExecutor(Executors.newCachedThreadPool());

    for(URL url : urlsToCraw){
    
    
      submitCrawlTask(url);
    }
    urlsToCrawl.clear();
  }

public synchronized void stop() throws InterruptedException{
    
    
  try{
    
    
    saveUncrawled(exec.shutdownNow());
    saveUncrawled(exec.getCancelledTasks());
  }finally{
    
    
    exec = null;
  }
}

protected abstract List<URL> processPage(URL url);

private void saveUnCrawled(List<Runnable> uncrawled){
    
    
  for(Runnable task : uncrawled){
    
    
    urlsToCrawl.add(((CrawlTask)task).getPage());
  }
}

private void submitCrawlTask(URL u){
    
    
  exec.execute(new CrawlTask(u));
}

private class CrawlTask implements Runnable{
    
    
  private final Url url;

  public void run(){
    
    
    for(URL link : processPage(url)){
    
    
      if(Thread.currentThread().isInterrupted()){
    
    
        return;
      }
      submitCrawlTask(link);
    }
  }
  
  public URL getPage(){
    
    
    return url;
  }

}



}

猜你喜欢

转载自blog.csdn.net/weixin_37632716/article/details/118638931