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;
}
}
}
Executor关闭操作备份未完成的任务
猜你喜欢
转载自blog.csdn.net/weixin_37632716/article/details/118638931
今日推荐
周排行