Мне задали вопрос в интервью, где у меня есть список, доступный в основном методе, и мне сказали, что для каждого элемента в списке есть какая-то операция, как бы я мог добиться этого с помощью концепции потоков. Рассмотрим следующую ситуацию: У меня есть список целых чисел. Мне нужно распечатать все значения из списка. Можно ли это сделать с помощью концепции потоков, где у меня есть несколько потоков, выполняемых на каждом элементе в списке, и где каждый поток используется для печати значения, а не одного потока, который печатает все значения? Я не пытаюсь изменить какое-либо значение в списке.Java Thread: пример приложения в реальном времени
ответ
Я надеюсь, что вы ищете что-то вроде этого:
public class MaltiThreadExample {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for (int i : list) {
Thread th = new Thread() {
@Override
public void run() {
System.out.println(i);
}
};
th.start();
}
}
}
Выход для одного исполнения:
run:
3
1
2
BUILD SUCCESSFUL (total time: 0 seconds)
Это не то же самое, порядок отличается. –
Это нормально, поскольку многопоточность связана с асинхронным аспектом. –
В этом случае это неправильный ответ, потому что он не соответствует сценарию: один поток печатает список в порядке, определенном индексом списка. –
Да, это типичный производитель-потребитель парадигма:
Представьте класс Runnable, который получает параметр Iterator как параметр и ждет определенного монитора, а затем потребляет один элемент из итератора, nd последний уведомляет о том же мониторе. Циклы, в то время как итератор имеет больше элементов.
Для этого будет достаточно создать список чисел, создать потоки потребителей, передающие им итератор списка, и запустить их.
Код, указанный ниже, не проверен вообще. Это просто то, что приходит в голову. Последняя реализация с использованием parallelStream() может быть тем, что вы ищете.
public class DemoApplication {
public static void main(String[] args) {
final List<Integer> myIntegerList = Arrays.asList(1, 2, 3);
// Good old for-each-loop
for (Integer item : myIntegerList) {
System.out.print(item);
}
// Java 8 forEach with Consumer
final Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer item) {
System.out.print(item);
}
};
myIntegerList.forEach(consumer);
// Java 8 forEach with Lambda
myIntegerList.forEach((item) -> System.out.print(item));
// Java 8 forEach on parallelStream with Lambda
myIntegerList.parallelStream().forEach((item) -> System.out.print(item));
}
}
я пытаюсь понять преимущество потоков.
Есть в основном две причины для использования нескольких потоков в программе:
(1) обработка Асинхронный событие: Представьте себе программу, которая должна ждать и ответить на несколько различных типов входных и каждого вид ввода может произойти в совершенно произвольные времена.
Перед нитями, мы использовали, чтобы написать большой цикл событий, что бы опроса для каждого различного рода события, а затем отправки различных обработчика функций. Вещи могли бы начать, чтобы получить некрасиво, когда один или несколько обработчиков событий было состояние (т.е. то, что он сделал дальше будет зависеть от истории предыдущих событий.)
Программы, которая имеет один поток для каждого различного вида событие часто намного чище. То есть легче понять, проще изменить и т. Д. Каждый поток цикла ожидает только одного вида события, а его состояние (если оно есть) может храниться в локальных переменных или его состояние может быть неявным (т. Е. зависит от того, какая функция имеет поток в любой момент времени).
(2) Многопроцессорная обработка (a.k.a., «параллельная обработка», «параллельное программирование», ...): Использование рабочих потоков для выполнения фоновых вычислений, вероятно, является наиболее распространенной моделью многопроцессорной обработки, используемой в данный момент времени.
Многопоточность - это самый низкий уровень всех моделей многопроцессорности, что означает: (а) это труднее всего понять, но (б) оно является наиболее универсальным.
- 1. Пример Java Thread?
- 2. Спецификация Java в реальном времени
- 3. Взаимодействие в реальном времени Java
- 4. Пример ограничения ad hoc thread в Java
- 5. Внедрение приложения для сопоставления в реальном времени
- 6. Использование шаблона одноэлементного дизайна в реальном времени java-приложения
- 7. Как передать видео в реальном времени из приложения Java?
- 8. Изменения в реальном времени в реальном времени
- 9. Обновление в реальном времени в реальном времени
- 10. Графическое отображение в реальном времени в Java
- 11. Тестирование приложения P2P в реальном времени
- 12. Бэкэнда в реальном времени для приложения IoT
- 13. Facebook в реальном времени обновленная стена приложения
- 14. Разработка чата/веб-приложения в реальном времени
- 15. Создание окна монитора в реальном времени приложения
- 16. Socketing для приложения Django в реальном времени
- 17. Javascript, счетчики и приложения в реальном времени
- 18. Использование D для приложения в реальном времени?
- 19. Java Thread Ping Pong пример Выпуск
- 20. Обновления в реальном времени в реальном времени с сервера
- 21. Java Event-Dispatch Thread пример программы зависает
- 22. Нужна в реальном времени пример действия в динамике Microsoft CRM
- 23. Передача текста в реальном времени в JAVA
- 24. Применение интерфейса в реальном времени в java
- 25. Создание блокнота в реальном времени в Java
- 26. Нажатие в реальном времени
- 27. Приложение для отслеживания времени в реальном времени
- 28. thread dump автономного приложения java
- 29. Библиотека графиков/диаграмм в реальном времени Java?
- 30. Java Swing.Timer получить в реальном времени миллисекунду
Это можно сделать, но это был бы очень плохой пример многопоточности. – Kayaman
да, это можно сделать –
Я пытаюсь понять преимущество нитей. В основном я вижу значения печати в примере цикла, который не очень просвещает. Мне задали аналогичный вопрос в интервью. – Fulcum