有没有一种很好的方法来实现一个执行策略来确定哪个线程将根据某种识别方案处理给定的任务?或者这是一个好方法吗?
我需要处理1个文件,我将以交错的块的形式收到这些文件。随着块的到来,我想完成处理该块的任务。问题是,我没有把处理代码线程安全的奢侈,所以一旦池中的线程处理了文件中的块,我需要相同的线程来处理该文件的其余部分。我不在乎一个线程是否一次处理多个文件,但我不能同时从一个池中处理同一个文件的一个线程。
“实践中的Java并发”一书指出,您可以使用执行策略来确定“将在什么线程中执行任务?”,但我不了解如何。
由于
答案 0 :(得分:3)
嗯,你可以写自己的ThreadPoolExecutor
- 但总的来说没办法做到这一点。线程池的重点是你只需要在它上面工作,而不关心哪个线程获得哪个任务。听起来你需要在这种情况下自己管理线程,保留哪个线程正在处理哪个文件的映射。
您知道文件何时完成?如果没有,你可能会遇到一个不断增长的地图的问题......
答案 1 :(得分:0)
一个好主意可能是每个文件的线程:
HashMap<String, MyThreadImplementer> fileToThreadMap...
class MyThreadImplementer implements Runnable {
int maxNumParts;
private List<FileChunk> chunkList...
private List<FileChunk> doneChunks...
public MyThreadImplementer(int maxNumberOfParts) {
maxNumParts=maxNumberOfParts;
}
public void run() {
while( doneChunks.size() < maxNumParts ) {
Thread.sleep(...)
if ( !chunkList.isEmpty() ) {
process each chunk in list and mvoe to done chunks
}
}
}
}
但是你需要注意不要处理1000个文件,从而创建1000个线程。
答案 2 :(得分:0)
你说你“没有让处理代码线程安全的奢侈”,但这并不意味着你需要将文件映射到特定的线程。它只是意味着您无法从文件开始处理下一个块,直到该文件中的最后一个块完成处理。
利用java.util.concurrent,您可以在主线程中维护Map<String, LinkedBlockingQueue<FileChunk>>
(假设文件名为键),并在块进入时将每个块分配给相应文件的队列。然后有一个Runnable
阻止每个队列。
这样,一次只有一个线程可以处理任何给定的文件。而且你不需要直接搞乱线程或维护多个线程池。