В моей программе пользователь может запускать различные задачи через интерфейс, обработка которых занимает некоторое время. Поэтому они выполняются потоками. До сих пор я реализовал это так, что у меня есть исполнитель с одним потоком, который выполняет все задачи одну за другой. Но сейчас хотелось бы все немного распараллелить.
т.е. Я хотел бы запускать задачи параллельно, но если у них один и тот же путь, я хочу запускать их последовательно. Например, у меня в пуле 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
Обработка задач параллельно и последовательно Java ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1727780824
Anonymous
В моей программе пользователь может запускать различные задачи через интерфейс, обработка которых занимает некоторое время. Поэтому они выполняются потоками. До сих пор я реализовал это так, что у меня есть исполнитель с одним потоком, который выполняет все задачи одну за другой. Но сейчас хотелось бы все немного распараллелить.
т.е. Я хотел бы запускать задачи параллельно, но если у них один и тот же путь, я хочу запускать их последовательно. Например, у меня в пуле 10 потоков, и когда приходит задача, она должна быть назначена работнику, который в данный момент обрабатывает задачу по тому же пути. Если ни одна задача с таким же путем в данный момент не обрабатывается работником, то задачу должен обрабатывать свободный в данный момент работник.
[b]Дополнительная информация:[/b] Задача — это любой тип задачи, выполняемой над файлом в локальной файловой системе. Например, переименование файла. Следовательно, задача имеет атрибут 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[i] = 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//];
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/61945308/processing-tasks-in-parallel-and-sequentially-java[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия