ThreadPoolExecutor - Указание, какой поток обрабатывает данную задачу - PullRequest
1 голос
/ 12 августа 2011

Есть ли хороший способ реализовать политику выполнения, которая определяет, какой поток будет обрабатывать данную задачу, основываясь на некоторой схеме идентификации?или это даже хороший подход?

У меня есть требование обрабатывать 1-много файлов, которые я получу чередующимися частями.по мере поступления чанков я хочу сделать задачу по обработке этого чанка.Суть в том, что у меня нет такой роскоши, как сделать код обработки потокобезопасным, поэтому, как только поток в пуле обработал кусок из файла, мне нужен этот же поток для обработки остальной части этого файла.Мне все равно, обрабатывает ли поток несколько файлов одновременно, но я не могу иметь более одного потока из пула, обрабатывающего один и тот же файл одновременно.

В книге «Параллелизм Java на практике» говорится, чтоМожно использовать политики выполнения, чтобы определить, «в каком потоке будет выполняться задача?», но я не понимаю, как.

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

Ну, вы могли бы написать свой собственный ThreadPoolExecutor - но в целом нет способа сделать это. Весь смысл пула потоков состоит в том, что вы просто выполняете работу, не заботясь о том, какой поток получает какую задачу. Похоже, что в этом случае вам нужно самостоятельно управлять потоками, сохраняя карту того, какой поток обрабатывает какой файл.

Знаете ли вы, когда файл был закончен? Если нет, то у вас могут возникнуть проблемы с постоянно растущей картой ...

0 голосов
/ 15 декабря 2011

Вы говорите, что «у вас нет роскоши делать код обработки потокобезопасным», но это не означает, что вам нужно сопоставлять файлы с конкретными потоками.Это просто означает, что вы не можете начать обработку следующего фрагмента из файла до тех пор, пока последний блок из этого файла не завершит обработку.

Используя преимущества java.util.concurrent, вы можете сохранить Map<String, LinkedBlockingQueue<FileChunk>> (принимая имя файла в качестве ключа) в главном потоке и назначая каждый чанк очереди соответствующего файла по мере поступления чанков. Затем в каждой очереди по одному блоку Runnable.

Таким образом, только один поток ввремя будет обрабатывать любой файл.И вам не нужно напрямую связываться с потоками или поддерживать несколько пулов потоков.

0 голосов
/ 12 августа 2011

Хорошей идеей может быть тема для файла:

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 потоков.

...