Обработка задач параллельно и последовательно JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Обработка задач параллельно и последовательно Java

Сообщение Anonymous »

В моей программе пользователь может запускать различные задачи через интерфейс, обработка которых занимает некоторое время. Поэтому они выполняются потоками. До сих пор я реализовал это так, что у меня есть исполнитель с одним потоком, который выполняет все задачи одну за другой. Но сейчас хотелось бы все немного распараллелить.
т.е. Я хотел бы запускать задачи параллельно, но если у них один и тот же путь, я хочу запускать их последовательно. Например, у меня в пуле 10 потоков, и когда приходит задача, она должна быть назначена работнику, который в данный момент обрабатывает задачу по тому же пути. Если ни одна задача с таким же путем в данный момент не обрабатывается работником, то задачу должен обрабатывать свободный в данный момент работник.
Дополнительная информация: Задача — это любой тип задачи, выполняемой над файлом в локальной файловой системе. Например, переименование файла. Следовательно, задача имеет атрибут path. И я не хочу одновременно выполнять две задачи над одним и тем же файлом, поэтому такие задачи с одинаковыми путями следует выполнять последовательно.
Вот мой пример кода, но есть работа:
Одна из моих проблем заключается в том, что мне нужен безопасный способ проверить, работает ли в данный момент рабочий процесс, и получить путь к работающему в данный момент рабочему процессу. Под безопасностью я подразумеваю отсутствие проблем одновременного доступа или других проблем с потоками.
public class TasksOrderingExecutor {

public interface Task extends Runnable {
//Task code here
String getPath();
}

private static class Worker implements Runnable {

private final LinkedBlockingQueue tasks = new LinkedBlockingQueue();

//some variable or mechanic to give the actual path of the running tasks??

private volatile boolean stopped;

void schedule(Task task) {
tasks.add(task);
}

void stop() {
stopped = true;
}

@Override
public void run() {
while (!stopped) {
try {
Task task = tasks.take();
task.run();
} catch (InterruptedException ie) {
// perhaps, handle somehow
}
}
}
}

private final Worker[] workers;
private final ExecutorService executorService;

/**
* @param queuesNr nr of concurrent task queues
*/
public TasksOrderingExecutor(int queuesNr) {
Preconditions.checkArgument(queuesNr >= 1, "queuesNr >= 1");
executorService = new ThreadPoolExecutor(queuesNr, queuesNr, 0, TimeUnit.SECONDS, new SynchronousQueue());
workers = new Worker[queuesNr];
for (int i = 0; i < queuesNr; i++) {
Worker worker = new Worker();
executorService.submit(worker);
workers = worker;
}
}

public void submit(Task task) {
Worker worker = getWorker(task);
worker.schedule(task);
}

public void stop() {
for (Worker w : workers) w.stop();
executorService.shutdown();
}

private Worker getWorker(Task task) {
//check here if a running worker with a specific path exists? If yes return it, else return a free worker. How do I check if a worker is currently running?
return workers[task.getPath() //HERE I NEED HELP//];
}
}


Подробнее здесь: https://stackoverflow.com/questions/619 ... ially-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»