Домой Учебники по Java и J2EE Java: пример использования для производителя — обработка одновременного чтения / записи

Java: пример использования для производителя — обработка одновременного чтения / записи

662
0

producer-consumer problem (также известный как bounded-buffer problem ) является классическим примером Java для проблемы многопроцессорной синхронизации .

Проблема описывает два процесса , the producer а также the consumer , которые используют общий буфер фиксированного размера, используемый в качестве очереди . Задача продюсера — сгенерировать кусок данных, поместить его в буфер и начать заново.

В то же время потребитель потребляет данные (т.е. удаляет их из буфера) по одному фрагменту за раз. Проблема состоит в том, чтобы убедиться, что производитель не будет пытаться добавить данные в буфер, если он заполнен, и что потребитель не будет пытаться удалить данные из пустого буфера .

Ниже простая Java-программа создаст эту проблему:

Примеры Java — проблема потребителя производителя

CrunchifyProducerConsumer.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
пакет ком . crunchify. учебные пособия ;
Импортировать Java. Util. Вектор ;
Импортировать Java. Util. Итератор ;
/ **
* @author Crunchify
* /
общественности учебный класс CrunchifyProducerConsumer {
     частный статический Вектор <Объект> данные знак равно новый Vector ( ) ;
     общественности статический недействительным main ( Строка [ ] аргументы ) {
         новый Производитель ( ) . начало ( ) ;
         новый Потребитель ( ) . начало ( ) ;
     }
     общественности статический учебный класс потребитель продолжается Нить {
         Потребитель ( ) {
             супер ( «Потребитель» ) ;
         }
         @Override
         общественности недействительным запустить ( ) {
             за (;;) {
                 пытаться {
                     Thread. сон ( 1 ) ;
                 } ловить ( Исключение е ) {
                     эл . printStackTrace ( ) ;
                 }
                 @SuppressWarnings ( rawtypes )
                 Итератор это знак равно данные . итератор ( ) ;
                 в то время как ( это . hasNext ( ) )
                     это. следующий ( ) ;
             }
         }
     }
     общественности статический учебный класс Режиссер продолжается Нить {
         Производитель ( ) {
             супер ( «Продюсер» ) ;
         }
         @Override
         общественности недействительным запустить ( ) {
             за (;;) {
                 пытаться {
                     Thread. сон ( 1 ) ;
                 } ловить ( Исключение е ) {
                     эл . printStackTrace ( ) ;
                 }
                 данные . добавить ( новый Объект ( ) ) ;
                 если ( данные . размер ( ) > 1000 )
                     данные . удалить ( данные . размер ( ) 1 ) ;
             }
         }
     }
}

Выпуск:

ConcurrentModificationException

1
2
3
4
Исключение в нить «Потребитель» Java. Util. ConcurrentModificationException
     в Яве . Util. ArrayList $ Итр . checkForComodification ( ArrayList . Java : 819 )
     в Яве . Util. ArrayList $ Итр . следующий ( ArrayList . Java : 791 )
     на ком . crunchify. учебники . CrunchifyProducerConsumer $ Потребитель . запустить ( CrunchifyProducerConsumer . Java : 36 )

Разрешение:

Добавить ключевое слово synchronized поставить замок на data пока мы его используем.

Лучшая Java-программа:

CrunchifyProducerConsumer.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
пакет crunchify. ком . учебные пособия ;
Импортировать Java. Util. Итератор ;
Импортировать Java. Util. Вектор ;
/ **
* @author Crunchify.com
* Пример потребительского потребителя в Java
* /
общественности учебный класс CrunchifyProducerConsumer {
частный статический Вектор <Объект> данные знак равно новый Vector ( ) ;
общественности статический недействительным main ( Строка [ ] аргументы ) {
новый Производитель ( ) . начало ( ) ;
новый Потребитель ( ) . начало ( ) ;
}
общественности статический учебный класс потребитель продолжается Нить {
Потребитель ( ) {
супер ( «Потребитель» ) ;
}
@SuppressWarnings ( rawtypes )
@Override
общественности недействительным запустить ( ) {
за (;;) {
пытаться {
Thread. сон ( 1000 ) ;
Система. вне. println ( Объект потребляется ################ ) ;
} ловить ( Исключение е ) {
эл . printStackTrace ( ) ;
}
синхронизированный ( данные ) {
Итератор это знак равно данные . итератор ( ) ;
в то время как ( это . hasNext ( ) )
это. следующий ( ) ;
}
}
}
}
общественности статический учебный класс Режиссер продолжается Нить {
Производитель ( ) {
супер ( «Продюсер» ) ;
}
@Override
общественности недействительным запустить ( ) {
за (;;) {
пытаться {
Thread. сон ( 1000 ) ;
Система. вне. println ( Произведенный объект ~~~~~~~~~~~~~~~ ) ;
} ловить ( Исключение е ) {
эл . printStackTrace ( ) ;
}
данные . добавить ( новый Объект ( ) ) ;
если ( данные . размер ( ) > 1000 )
данные . удалить ( данные . размер ( ) 1 ) ;
}
}
}
}

Пример получателя Java Producer Результат:

Java: пример использования для производителя — обработка одновременного чтения / записи

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Учебник по встроенному веб-серверу: как запустить сервер встроенного HTTP-джерси во время запуска приложения Java

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь