- Печать Четных и нечетных чисел С использованием 2 потоков
- 1. введение
- 2. Потоки в Java
- 3. Синхронизация потоков
- 4. Межпоточная связь
- 5. Печать нечетных и четных чисел Поочередно
- 5.1. Использование wait() и notify()
- 5.2. Использование семафоров
- 6. Заключение
- Вывод нечётных элементов массива через запятую
- 5 ответов 5
- Вывод нечётных элементов массива через запятую Java
- 7 ответов 7
- Ввод и вывод данных на консоль четных и нечетных чисел
- Как написать код, который печатает четные и нечетные числа, используя цикл for-each в массиве в java
- 2 ответа
Печать Четных и нечетных чисел С использованием 2 потоков
Узнайте, как синхронизировать потоки для печати четных и нечетных чисел поочередно
Автор: baeldung
Дата записи
1. введение
В этом уроке мы рассмотрим, как мы можем печатать четные и нечетные числа с помощью двух потоков.
Цель состоит в том, чтобы напечатать числа по порядку, в то время как один поток печатает только четные числа, а другой поток печатает только нечетные числа. Для решения этой проблемы мы будем использовать концепции синхронизации потоков и межпотоковой связи.
2. Потоки в Java
Потоки-это легкие процессы, которые могут выполняться одновременно. Одновременное выполнение нескольких потоков может быть хорошим с точки зрения производительности и загрузки процессора, так как мы можем работать над несколькими задачами одновременно через разные потоки, работающие параллельно.
Более подробную информацию о потоках в Java можно найти в этой статье .
В Java мы можем создать поток, либо расширив класс Thread , либо реализовав Выполняемый интерфейс . В обоих случаях мы переопределяем метод run и записываем в него реализацию потока.
Более подробную информацию о том, как использовать эти методы для создания потока, можно найти здесь .
3. Синхронизация потоков
В многопоточной среде возможно, что 2 или более потоков обращаются к одному и тому же ресурсу примерно в одно и то же время. Это может привести к летальному исходу и ошибочным результатам. Чтобы предотвратить это, нам нужно убедиться, что только один поток обращается к ресурсу в данный момент времени.
Мы можем достичь этого с помощью синхронизации потоков.
В Java мы можем пометить метод или блок как синхронизированный, что означает, что только один поток сможет ввести этот метод или блок в данный момент времени.
Более подробную информацию о синхронизации потоков в Java можно найти здесь .
4. Межпоточная связь
Взаимодействие между потоками позволяет синхронизированным потокам взаимодействовать друг с другом с помощью набора методов.
Используются методы wait , notify, и notifyAll, которые все унаследованы от класса Object .
Wait() заставляет текущий поток ждать неопределенно долго, пока какой-либо другой поток не вызовет notify() или notifyAll() на том же объекте. Мы можем вызвать notify() для пробуждения потоков, ожидающих доступа к монитору этого объекта.
Более подробную информацию о работе этих методов можно найти здесь .
5. Печать нечетных и четных чисел Поочередно
5.1. Использование wait() и notify()
Мы будем использовать обсуждаемые концепции синхронизации и межпотоковой связи для печати нечетных и четных чисел в порядке возрастания с использованием двух разных потоков.
На первом шаге мы реализуем интерфейс Runnable для определения логики обоих потоков . В методе run мы проверяем, является ли число четным или нечетным.
Если число четное, мы вызываем метод print Even класса Printer , в противном случае мы вызываем метод print Odd :
Мы определяем класс Printer следующим образом:
В основном методе мы используем определенный класс для создания двух потоков. Мы создаем объект класса Принтер и передаем его в качестве параметра конструктору Задача Четная Нечетная :
Первый поток будет нечетным потоком, поэтому мы передаем false в качестве значения параметра isEvenNumber . Для второго потока мы передаем true вместо этого. Мы устанавливаем значение MaxValue равным 10 для обоих потоков, чтобы печатались только числа от 1 до 10.
Затем мы запускаем оба потока, вызывая метод start () . Это вызовет метод run() обоих потоков, как определено выше, в котором мы проверяем, является ли число нечетным или четным, и печатаем их.
Когда нечетный поток начнет работать, значение переменной number будет равно 1. Поскольку он меньше MaxValue , а флаг isEvenNumber равен false, вызывается printOdd () . В методе мы проверяем, является ли флаг нечетным истинным, и пока он истинен, мы вызываем wait(). Так как нечетно изначально ложно, wait() не вызывается, и значение выводится.
Затем мы устанавливаем значение is Odd в true, чтобы нечетный поток переходил в состояние ожидания и вызывал notify () , чтобы разбудить поток событий. Затем четный поток просыпается и печатает четное число, так как флаг odd является ложным. Затем он вызывает notify () , чтобы разбудить нечетный поток.
Тот же процесс выполняется до тех пор, пока значение переменной number не станет больше MaxValue .
5.2. Использование семафоров
Семафор управляет доступом к общему ресурсу с помощью счетчика. Если счетчик больше нуля, то доступ разрешен . Если он равен нулю, то доступ запрещен.
Java предоставляет класс Semaphore в пакете java.util.concurrent , и мы можем использовать его для реализации описанного механизма. Более подробную информацию о семафорах можно найти здесь .
Мы создаем два потока, нечетный поток и четный поток. Нечетный поток будет печатать нечетные числа, начиная с 1, а четный поток будет печатать четные числа, начиная с 2.
Оба потока имеют объект класса Общий принтер . Класс Общий принтер будет иметь два семафора, кажутся нечетными и кажутся четными , которые будут иметь разрешения 1 и 0 для начала . Это гарантирует, что нечетное число будет напечатано первым.
У нас есть два метода print Четное число() и print Нечетное число(). Нечетный поток вызывает метод print Odd Num() , а четный поток вызывает метод print Even Num () .
Чтобы напечатать нечетное число, метод acquire() вызывается на seem Odd , и поскольку начальное разрешение равно 1, он успешно получает доступ, печатает нечетное число и вызывает release() on semEven.
Вызов release() увеличит разрешение на 1 для seven , и тогда четный поток сможет успешно получить доступ и напечатать четное число.
Это код для рабочего процесса, описанного выше:
6. Заключение
В этом уроке мы рассмотрели, как мы можем печатать нечетные и четные числа поочередно, используя два потока в Java. Мы рассмотрели два метода для достижения одинаковых результатов: использование wait() и notify() и использование семафора .
И, как всегда, полный рабочий код доступен на GitHub .
Источник
Вывод нечётных элементов массива через запятую
Напишите метод printOddNumbers , который принимает массив и выводит в консоль только нечётные числа из него через запятую. Конец вывода должен перевести курсор на новую строку.
Пример ввода: [3,5,20,8,7,3,100]
Пример вывода: 3, 5, 7, 3
Вывод такой: 5, 5, 5, 5, 5,
Я не могу понять, как оформить решение так, чтобы последняя запятая не выводилась, наверное, я уже устал и не вижу очевидного решения. Буду благодарен, если кто-то также подскажет решение покороче.
5 ответов 5
Очевидно, что лучшим вариантом является вариант с поиском первого нечётного числа (8),
ну либо вариант с Regex (10), если вы извращенец.
(1) Вариант со стримом-фильтровальщиком.
Варианты со списком.
(3) Объединение элементов вручную.
(4) Объединение с помощью метода String.join(CharSequence, Iterable ) . (видоизменённая реализация Qwertiy)
(5) Вариант с обрезанием возвращаемого значения метода List.toString() .
(6) Вариант со StringJoiner .
(7) Вариант с boolean переменной.
(8) Вариант с поиском первого нечётного числа. (Самый быстрый)
(9) Вариант с поиском последнего нечётного числа.
Варианты с обрезанием запятой.
(12) Последней. (Идея rjhdby)
(13) Вариант с сепаратором. (Идея aleksandr barakin)
(14) Вариант с компиляцией строки при помощи методов анонимного класса.
(15) Варианты с рекурсией и обрезанием массива с начала.
(На самом деле есть ещё два варианта с обрезанием массива с конца, но они настолько похожи на эти, что я решил их не включать)
С помощью индекса.
С помощью копирования массивов.
(16) Варианты с рекурсией и ополовиниванием массива.
С помощью индексов.
С помощью копирования массивов.
(17) Вариант с созданием нового массива из нечётных чисел вручную.
(18) Вариант с проверкой длины (пустоты) StringBuilder(а) .
(19) Вариант с двойным пробеганием массива и сохранением количества нечётных чисел.
(20) Вариант с пробеганием массива с двух сторон.
(21) Вариант с пробеганием массива в обе стороны из середины.
(22) Совсем ненормальный вариант с regex и двумя стримами один в другом.
(23) Вариант с вырезанием всех чётных чисел.
(24) Вариант с переносом всех нечётных чисел в начало массива.
(25) Вариант с конечным автоматом.
Источник
Вывод нечётных элементов массива через запятую Java
помогите, пожалуйста, разобраться : есть метод printOddNumbers, который принимает массив и выводит в консоль только нечетные числа из него, через запятую. Конец вывода должен перевести курсор на новую строку.
Пример ввода: [3,5,20,8,7,3,100]
Пример вывода: 3,5,7,3
У меня на выходе получается : 3,5,7,3,
То есть мне нужно убрать последнюю запятую.
Помогите, пожалуйста, как можно убрать запятую в конце?
Также у меня не работает этот код в случае если элементы массива отрицательные. Помогите, пожалуйста, найти баг. Заранее спасибо.
Ссылка на онлайн-компилятор с кодом:
7 ответов 7
Помогите, пожалуйста, как можно убрать запятую в конце?
А зачем вы ее добавляете?
для каждого элемента в конце добавляется запятая. Тут есть три решения
После цикла удалять из StringBuilder последнюю запятую
Добавлять запятую перед элементом для всех, кроме первого
не работает этот код в случае если элементы массива отрицательные
Потому, что остаток от деления отрицательного нечетного числа на 2 будет -1 . Поэтому если проверку на нечетность переписать вот так
то код будет работать как с положительными, так и с отрицательными числами
Кроме того, при таком цикле
вы будете пропускать последний элемент массива. Цикл должен быть таким
Источник
Ввод и вывод данных на консоль четных и нечетных чисел
Здравствуйте! Подскажите по коду, что можно переделать или добавить?
Задача:
Создать программу, которая будет сообщать,
является ли целое число, введённое пользователем,
чётным или нечётным. Если пользователь
введёт не целое число, то сообщать ему об ошибке.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Написать программу, которая предлагает пользователю ввести 10 чисел, вычисляет процент четных и нечетных чисел и выводит результат в консоль
Написать программу, которая предлагает пользователю ввести 10 чисел, вычисляет процент четных и.
Ввод массива и вывод из него на экран сначала чётных, а потом нечётных символов
Нужно ввести массив и вывести из него на экран сначала чётные символы,а потом нечётные заранее.
Ввод и вывод данных на консоль (fasm)
Нужно дополнить код ,что бы значение string и raz вводил с клавиатуры,а результат просто выводился.
Ввод и вывод строковых данных на консоль
Здравствуйте! Подскажите по коду, что можно переделать или добавить? Задание: public class.
та вообще норм
можно еще каждое действие закрыть в метод, так вроде советуют делать
Источник
Как написать код, который печатает четные и нечетные числа, используя цикл for-each в массиве в java
Я написал код, который должен печатать нечетные и четные числа из массива с использованием цикла for-each в Java, но, к сожалению, он показывает «Исключение в потоке» main «java.lang .
2 ответа
Я написал код, который должен печатать нечетные и четные числа из массива с использованием цикла for-each в Java, но, к сожалению, он показывает
«Исключение в потоке» main «java.lang.ArrayIndexOutOfBoundsException: 22».
Это потому, что вы используете элементы массива как сами индексы массива. Он не работает на 22, потому что это первое значение в массиве, превышающее размер массива.
У вас есть циклы на основе индекса
И у вас есть (среди прочего) улучшенный цикл for , который позволяет вам напрямую перебирать содержимое (например) массива без необходимости явно указывать индекс.
синтаксис цикла для каждого
array — массив или коллекция
item — каждый элемент массива / коллекции присваивается этой переменной dataType
тип данных — массива / коллекции, массива / коллекции
Это позволяет сделать код более лаконичным и менее подверженным ошибкам:
Этот цикл очень полезен, потому что часто требуется выполнить итерацию по всем элементам массива, не заботясь об индексе, кроме доступа к элементу в массиве.
Здесь «i» — это не индекс вашего массива, это именно элемент, поэтому вам не нужно получать значение таким способом
Достаточно просто так сослаться
Поэтому было бы лучше не использовать имя переменной «i» в таком контексте, но
Источник