Java Multi Threading - примеры использования в реальном мире
Я хочу работать в многопоточном режиме, но в моем текущем проекте таких возможностей нет. Кто-то, пожалуйста, назовите меня, где мне следует начать. Мне нужны сценарии реального времени, чтобы я мог сразу перейти на кодирование. Я читаю бок о бок, а также.
Можете ли вы обратиться к некоторым сайтам для занятий.
Ответы
Ответ 1
Google может перенести вас на практикующие веб-сайты (гораздо лучше, чем я могу). Хороший сценарий в реальном времени может включать любое из следующих (может показаться академическим, но навыки абсолютно переносимы на практику):
- Обещающая проблема философа.
- Проблема с читателем/писателем.
- Проблема с потребителем/производителем.
Некоторые более конкретные:
- Параллельный альфа-бета-поиск (это очень сложно).
- Любой генетический алгоритм может быть реализован одновременно, и поскольку память/хранилище распределены между потоками, может быть довольно сложным, если сделать это правильно (попробуйте полупрозрачный многоугольник, рисующий проект изображения. Для этого вы можете искать в Google).
- Совлокальный доступ к базе данных может быть довольно интересным. Нарисуйте сценарий для себя.
- Посмотрите http://projecteuler.net/, который включает в себя множество интересных проблем. Многие из проблем могут быть реализованы с использованием потоков.
Enjoy.
Ответ 2
Я бы посмотрел библиотеку disruptor. Это вводит много передовых концепций многопоточности, и как только вы это поймете и сможете их использовать, вы узнаете больше, чем большинство из них по этому вопросу.
Ответ 3
Есть несколько проблем с Java, которые просто кричат о многопоточном решении. В последнее время я недавно решил и решил:
- File.list имеет ужасные проблемы, если в папке много тысяч файлов.
- SAXParser.parse - это синтаксический анализатор push. Многие пользователи xml предпочли бы синтаксический анализатор, но скорее не добавили бы еще одну библиотеку.
Оба из них могут быть значительно облегчены с помощью простого двухпоточного решения.
В случае File.list запустите File.list
в отдельном потоке со специальным FileFilter
, который отправит все файлы, представленные ему, в BlockingQueue
. Итератор на BlockingQueue
может затем использоваться для доставки файлов вызывающему. Усовершенствование, чтобы перечислить каталог рекурсивно, является легким дополнением, если код написан правильно.
SAXParser.parse можно преобразовать наизнанку так же.
Я сделал это и совсем недавно, и нашел опыт очень полезным.
Ответ 4
Я бы порекомендовал вам создать следующую систему для начала темы:
-
Лифт (3 в строке), учитывающий следующие параметры:
Потребление энергии, т.е. ближайший лифт, возьмет ваш запрос в зависимости от того, движется ли он вверх или сейчас и пользовательский запрос, вес на лифте
Потребление времени.
-
Система чтения и записи файлов, где несколько пользователей могут:
Edit/Write/Search/Delete a file
Ответ 5
Многопоточность, имитируемая потоками пользовательского уровня. Эти потоки реализованы на уровне приложений, а не на уровне ядра операционной системы.
Эти потоки также называются зелеными нитями, потому что они свежие (совершенно новые) и молодые (не зрелые или зрелые).
Примеры использования в реальном мире
- В Компьютерные игры, такие объекты, как автомобили, мотоциклы и т.д. Это просто потоки.
- Асинхронная связь может позволить приложению выполнять дополнительные задачи, а не ждать завершения задач.
- Приложения, у которых есть ряд задач, которые могут выполняться в любом порядке, часто могут быть полезны при распределенной асинхронной связи.
Ответ 6
Когда один поток занимает много времени, чтобы завершить вычислительную деятельность, вы должны разбить его на небольшие задачи и использовать многопоточность, чтобы сократить время вычислений.
Вы можете увидеть множество вариантов использования для многопоточности в вашем проекте.
- Если некоторые задачи могут выполняться независимо друг от друга в зависимости от других задач (просто установите новый
Thread
или отправьте Runnable/Callable
задачи на ExecutorService/ThreadPoolExecutor
)
-
Если вам нужно дождаться завершения нескольких параллельных задач, чтобы перейти к следующей задаче (invokeAll()
)
например. Задача 1 запускает три независимых задания Задача 2, Задача 3 и Задача 4, но Задача 5 должна начинаться после завершения Задачи 2, Задачи 3 и Задачи 4.
Task 1
----->
Task 2
----->
Task 3
----->
Task 4
----->
Task 5
-------------------------->
- Система способна использовать несколько ядер процессора
- Если у вас есть примеры использования Задачи Fork-Join (используйте: ForkJoinPool)
- Если вы хотите показать ход выполнения длинной задачи вычисления (индикатор выполнения может быть показан в одном потоке, а долгая задача вычисления может быть выполнена другим потоком)
Похожие сообщения:
Как правильно использовать Java Executor?
Использовать службу invokeAll или submit - java Executor
Java-приложение Fork/Join vs ExecutorService - когда использовать, который?
дождитесь, пока все потоки закончат работу в java