比方说,我有一个ExecutorService
(.newFixedThreadPool(2))
需要一系列请求。为了简单起见,它们只是:{ String url }
在运行未完成任务之前筛选ExecutorService ThreadPool
假设我按照该顺序的网址为[ aaa, bbb, ccc, aaa, ddd, aaa, ... ]
。 (是的,aaa
被重复多次)
那些url事件异步进来,所以它们都会在到达时提交到ExecutorService
。
有没有办法让ExecutorService在允许下一个未决项目运行前检查一个条件?例如。检查未来的未决结果是否包含'aaa',如果是,则丢弃它,以便只触发最近的结果。
我想出了一个hacky的方式,通过将url请求映射到时间戳并让线程死亡,如果他们的时间戳不再匹配。但是,这具有ExecutorService仍然运行所有请求导致到最新的结果,如果连续提交很多请求,这可能会很重。
任何意见将不胜感激...谢谢!
我还没有在一段时间用'Executors'工作,也许也看看'执行人#newCachedThreadPool()'等等 - 我只是不能给任何意见另一个'Executors'构造函数和'ExecutorService'子类关闭了我的头顶... –
非常感谢这么详细的回复,我真的很感激它!它实际上不仅仅是url地图,因为它实际上必须确保该请求对于特定视图,url,图像增强标识以及提交它的时间戳是有效的。这是一个https://github.com/mattsilber/imageloader我实际上正在考虑扩展ThreadPoolExecutor在此刻从beforeExecute队列中删除项目,以避免问题,但队列和未决项目之间的包装可以很好地工作......感谢您的建议! – Guardanis
我的荣幸!也许别人回答一些有用的见解。我想我的方法会遇到问题,如果“队列处理线程”无法将足够快的“url事件”传递给其他线程。我想可以有一个'ExecutorService'来管理队列,然后是另一个'ExecutorService'来处理事件。但是,那么它开始变得复杂:) –