Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
61 / 1 / 1
Регистрация: 14.11.2010
Сообщений: 66

Синхронизация параллельных процессов с использованием блокирующей очереди

21.11.2015, 19:19. Показов 1354. Ответов 2

Студворк — интернет-сервис помощи студентам
Пример использования блокирующей очереди
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.util.concurrent.*;
 
class Producer implements Runnable {
  private final BlockingQueue<Integer> queue;
  int procNumber;
 
  Producer( int p, BlockingQueue<Integer> q) { 
    queue = q; 
    procNumber = p;
    }
 
  public void run() {
    try {
      for (int i = 0; i < 10; ++i) { 
        queue.put( (Integer)produce( i)); 
        }
      queue.put( 0); 
      queue.put( 0); 
      } 
    catch (InterruptedException ex) { 
      System.out.println( "Process (" + procNumber + "): " + ex.toString());
      }
    }
 
  Object produce( int i) { 
      System.out.println( "Producer(" + procNumber + "): " + i);
      return( i + 10);
      }
  }
 
class Consumer implements Runnable {
  private final BlockingQueue<Integer> queue;
  int procNumber;
 
  Consumer( int p, BlockingQueue<Integer> q) { 
    queue = q; 
    procNumber = p;
    }
 
  public void run() {
    try {
      while (true) { 
        consume( queue.take()); 
        }
      } 
    catch (InterruptedException ex) { 
      System.out.println( "Process (" + procNumber + "): " + ex.toString());
      }
    }
 
  void consume( Integer x) throws InterruptedException { 
    System.out.println( "Result(" + procNumber + "): " + x);
    if (x == 0) {
      throw new InterruptedException();
      }
    }
  }
 
public class BlockingQueueDemo {
  public static void main( String args[]) {
    System.out.println( "Main process started");
      SynchronousQueue<Integer> q = new SynchronousQueue<Integer>( true);
      Producer p = new Producer( 1, q);
      Consumer c1 = new Consumer( 1, q);
      Consumer c2 = new Consumer( 2, q);
      new Thread( p).start();
      new Thread( c1).start();
      new Thread( c2).start();
    }
  }
задание
Разработать распределенную программу, состоящую из пяти процессов. Первый процесс генерирует трьохкомпонентнi векторы (a1, a2, a3) и передает их ко второму процессу. Второй процесс распределяет компоненты векторов следующим образом:
- первую компоненту вектора передает третьему процесса;
- Второй компонент вектора передает четвертом процесса;
- Третий компонент вектора передает пятом процесса.
Третий, четвертый i пятый процессы подсчитывает суммы значений компонентов векторов, что к ним поступили и выводят результаты в консоль. Количество данных, которые надо сгенерировать и обработать, задать как параметр в командной строке при запуске программы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2015, 19:19
Ответы с готовыми решениями:

синхронизация процессов с использованием мьютексов
помогите, не могу найти информацию для работы с мьютексами для синхронизации процессов

Синхронизация параллельных потоков в WINAPI
В общем задали такую лабораторную работу. Создать два потока. Первый поток производит запись в массив случайных данных. Второй...

Программирование параллельных процессов
Лабораторная работа для дисциплины &quot;операционные системы&quot; Существует ли еще фриленс на форуме? Не отказался бы от бескорыстной помощи...

2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
22.11.2015, 03:19
Потоки останавливаются с помощью "ядовитых объектов".

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class Test {
 
    private static class VectorGenerator implements Runnable {
 
        private final Random random;
        private final BlockingQueue<List<Integer>> queue;
        private final int numberOfVectors;
        private final int vectorSize;
        private final List<Integer> poisonVector;
 
        private VectorGenerator(Random random, BlockingQueue<List<Integer>> queue, int numberOfVectors, int vectorSize,
                List<Integer> poisonVector) {
            this.random = random;
            this.queue = queue;
            this.numberOfVectors = numberOfVectors;
            this.vectorSize = vectorSize;
            this.poisonVector = poisonVector;
        }
 
        @Override
        public void run() {
            try {
                for (int i = 0; i < numberOfVectors; ++i) {
                    final List<Integer> vector = random.ints(vectorSize, 0, 10)
                            .mapToObj(Integer::new)
                            .collect(Collectors.toList());
                    queue.put(vector);
                }
                queue.put(poisonVector);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
        }
    }
 
    private static class VectorProcessor implements Runnable {
 
        private final BlockingQueue<List<Integer>> queue;
        private final List<BlockingQueue<Integer>> processingQueues;
        private final List<Integer> poisonVector;
        private final Integer poisonInteger;
 
        private VectorProcessor(BlockingQueue<List<Integer>> queue, List<BlockingQueue<Integer>> processingQueues,
                List<Integer> poisonVector, Integer poisonInteger) {
            this.queue = queue;
            this.processingQueues = processingQueues;
            this.poisonVector = poisonVector;
            this.poisonInteger = poisonInteger;
        }
 
        @Override
        public void run() {
            try {
                while (true) {
                    final List<Integer> vector = queue.take();
                    if (vector == poisonVector) {
                        break;
                    }
                    for (int j = 0; j < processingQueues.size(); ++j) {
                        processingQueues.get(j).add(vector.get(j));
                    }
                }
                for (BlockingQueue<Integer> queue : processingQueues) {
                    queue.put(poisonInteger);
                }
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
        }
    }
 
    public static class DimensionCalculator implements Runnable {
 
        private final BlockingQueue<Integer> queue;
        private final String name;
        private final Integer poisonInteger;
 
        public DimensionCalculator(BlockingQueue<Integer> queue, String name, Integer poisonInteger) {
            this.queue = queue;
            this.name = name;
            this.poisonInteger = poisonInteger;
        }
 
        @Override
        public void run() {
            int counter = 0;
            while (true) {
                try {
                    final Integer value = queue.take();
                    if (value == poisonInteger) {
                        break;
                    }
                    counter += value;
                } catch (InterruptedException e) {
                    throw new IllegalStateException(e);
                }
            }
            System.out.println(name + ": " + counter);
        }
    }
 
    public static void main(String[] args) {
        final int amount = 5000;
        final int vectorSize = 3; // трьохкомпонентнi
 
        final List<Integer> poisonVector = new ArrayList<>();
        final Integer poisonInteger = new Integer(0);
        final Random random = new Random();
 
        final BlockingQueue<List<Integer>> vectorQueue = new LinkedBlockingQueue<>();
        final List<BlockingQueue<Integer>> processingQueues = Stream.generate(LinkedBlockingQueue<Integer>::new)
                .limit(vectorSize)
                .collect(Collectors.toList());
 
        new Thread(new VectorGenerator(random, vectorQueue, amount, vectorSize, poisonVector)).start();
        new Thread(new VectorProcessor(vectorQueue, processingQueues, poisonVector, poisonInteger)).start();
        for (int i = 0; i < vectorSize; ++i) {
            new Thread(new DimensionCalculator(processingQueues.get(i), Integer.toString(i), poisonInteger)).start();
        }
    }
}
1
61 / 1 / 1
Регистрация: 14.11.2010
Сообщений: 66
27.11.2015, 02:59  [ТС]
спасибо.
вы все сделали что в задании?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2015, 02:59
Помогаю со студенческими работами здесь

Организация параллельных процессов
Мне нужно организовать 5 параллельных процессов, каждый длится от 1 до 5 секунд. И каждый процесс при запуске и при завершении выдает...

Программирование параллельных процессов С++ Builder TThread
Здравствуйте! Пожалуйста объясните или подскажите книгу.... Мне надо создать два массива чисел, а потом по графу ими оперировать разними...

Вычисление суммы чисел, от параллельных процессов MPI
Задача такая, запускаются параллельно 5 процессов, каждый из них генерит рандомное число и отправляет соседнему процессу, нужно вывести...

Синхронизация процессов
Добрый день уважаемые форумчане. Если ошибся разделом - поправьте. Вкратце опишу проблему. Есть терминальный сервер и некая...

синхронизация процессов
нужна помощь!! Суть задачи состоит в том, что мы создаем приложение с двумя дополнительными потоками писателей и двумя потоками читателей....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru