是否有一种很好的方法来实现执行策略,以确定哪个线程将根据某些识别方案处理给定的任务?或者这是一个好方法吗?
我需要处理1-多个文件,这些文件将以交错块的形式接收。当数据块到达时,我想把处理这些数据块作为一个任务。问题是,我没有使处理代码线程安全的奢侈,所以一旦池中的一个线程处理了文件中的一个块,我就需要同一个线程来处理该文件的其余部分。我不关心一个线程是否同时处理多个文件,但是我不能让一个池中的多个线程同时处理同一个文件。
《Java并发实践》一书指出,您可以使用执行策略来确定"任务将在哪个线程中执行?",但我不明白如何执行。
谢谢
好吧,您可以编写自己的ThreadPoolExecutor
-但通常没有办法做到这一点。线程池的全部意义在于,您只需将工作丢给它,而不必关心哪个线程得到哪个任务。听起来,在这种情况下,您需要自己管理线程,保存哪个线程正在处理哪个文件的映射。
你知道什么时候文件已经完成了吗?如果没有,您可能会遇到不断增长的映射问题…
一个好主意可能是每个文件一个线程:
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个线程。
您说"没有使处理代码线程安全的奢侈",但这并不意味着您需要将文件映射到特定的线程。它只是意味着你不能开始处理文件中的下一个块,直到该文件中的最后一个块完成处理。
利用java.util。同时,您可以在主线程中维护一个Map<String, LinkedBlockingQueue<FileChunk>>
(假设filename为键),并在块进入时将每个块分配给相应文件的队列。然后在每个队列上阻塞一个Runnable
。
这样,每次只有一个线程在处理给定的文件。而且您不需要直接乱搞线程或维护多个线程池。